C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: FileStreamのアクセス拒否について


(過去ログ 98 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■58368 / inTopicNo.1)  FileStreamのアクセス拒否について
  
□投稿者/ yamada (1回)-(2011/03/31(Thu) 16:26:06)

分類:[VB.NET/VB2005 以降] 

2011/03/31(Thu) 16:28:40 編集(投稿者)
2011/03/31(Thu) 16:27:59 編集(投稿者)
2011/03/31(Thu) 16:27:56 編集(投稿者)

<pre><pre>お世話になっております
VB.NET 2003 + FrameWork1.1でWEBアプリケーションを作成しております。

複数件のデータを帳票に印字する際に画像も表示させようと思っています
基本的にキーデータに1枚ずつの画像が存在しており
5件のデータがあったら、5枚の異なる画像が存在しているようなイメージです。

画像データを内部変数に保存する必要があったため
System.IO.FileStreamを使用してByte配列に保持する事にしました。

ところが1件目は正常に取り込めるのですが、
2件目で「パス”○○○.jpg”へのアクセスが拒否されました」
と表示されて取り込めない状態になってしまいます。
○○○.jpgは2回目に取り込もうとしているファイル名で1回目ではありません

構文としては
---------------------------------------------------------------------------
dim fs as FileStream
fs = New FileStream(画像へのフルパス, FileMode.Open, FileAccess.Read) ←【エラーの発生場所】

Redim btBUF(fs.Length - 1)
dim readBytes as long = fs.Read(btBUF, 0, fs.Length)
fs.Close()
---------------------------------------------------------------------------
のように取得しております

色々と調べてみると、1回目でfs内に保存された情報が
Close時に破棄されておらず、残ったままになっているようでした
Closeしても破棄されないのは何かやり方が不味いのでしょうか?
Framework 1.1の為、Disposeもありません。

1回だけでなくループで複数回取得したいような場合に
何か良い方法をご存知でしたらお教え願います。

引用返信 編集キー/
■58369 / inTopicNo.2)  Re[1]: FileStreamのアクセス拒否について
□投稿者/ 矢沢 (1回)-(2011/03/31(Thu) 16:34:40)
No58368 (yamada さん) に返信

ループ内でインスタンスがどうなっているか見たいので、
ループを含んだソースを見せてもらえますか?
引用返信 編集キー/
■58370 / inTopicNo.3)  Re[2]: FileStreamのアクセス拒否について
□投稿者/ マサヤ (305回)-(2011/03/31(Thu) 16:42:47)
fs = New FileStream(画像へのフルパス, FileMode.Open, FileAccess.Read)
をusingステートメントにしてみてはいかがでしょうか?
引用返信 編集キー/
■58371 / inTopicNo.4)  Re[3]: FileStreamのアクセス拒否について
□投稿者/ 矢沢 (2回)-(2011/03/31(Thu) 16:49:03)
2011/03/31(Thu) 16:51:54 編集(投稿者)

No58370 (マサヤ さん) に返信
> fs = New FileStream(画像へのフルパス, FileMode.Open, FileAccess.Read)
> をusingステートメントにしてみてはいかがでしょうか?

Framework 1.1ではUsingはないはずです。
引用返信 編集キー/
■58372 / inTopicNo.5)  Re[2]: FileStreamのアクセス拒否について
□投稿者/ yamada (2回)-(2011/03/31(Thu) 16:54:19)
2011/03/31(Thu) 16:54:35 編集(投稿者)
矢沢様、以下のようになっております

for i=1 to データ数

	'ファイル名の生成
        strFileName = "TEST-" & i &  ".jpg"

        '実ファイルの有無チェックを行う
        If System.IO.File.Exists(strFullPath & strFileName) = Treu Then
	
        	Dim fs As FileStream
                Try
                	fs = New FileStream(strThumbnail_FullPath & strFileName, FileMode.Open, FileAccess.Read)

                        ReDim btBUF(fs.Length - 1)
                        Dim readBytes As Long = fs.Read(btBUF, 0, fs.Length)
                        fs.Close()

                        'BASE64にコンバートして保持する
                        strBASE64 = System.Convert.ToBase64String(btBUF)
                        PriDat(i).strHojiData = strBASE64

                Finally
	                If Not (fs Is Nothing) Then
        	                fs.Close()
        	        End If
	        End Try
	End If
Next i


引用返信 編集キー/
■58373 / inTopicNo.6)  Re[3]: FileStreamのアクセス拒否について
□投稿者/ yamada (3回)-(2011/03/31(Thu) 16:56:03)
マサヤ様

矢沢様が先にご回答していただいてますが
Framework1.1ではUsingが使用出来ないのです

ご指摘ありがとうございました
引用返信 編集キー/
■58374 / inTopicNo.7)  Re[3]: FileStreamのアクセス拒否について
□投稿者/ 矢沢 (3回)-(2011/03/31(Thu) 17:12:40)
No58372 (yamada さん) に返信
直接の回答ではありませんが、少なくとも、コードにある strThumbnail_FullPath & strFileName というファイルは
問題なく存在するのですよね?
(上記記述の前に、strFullPath & strFileName というファイルの存在を確認していますが、このファイルとは
別のように見受けました)

また、tryの中に

Dim readBytes As Long = fs.Read(btBUF, 0, fs.Length)
fs.Close()

とクローズしているのですが、Finallyの中でも
If Not (fs Is Nothing) Then
fs.Close()
End If

としています。
本筋ではないかもしれませんが、try内でfs.Closeを行っても、fsはNothingになったわけではないので、
Finally以下のIf文を正しく通過させるには、try内のfs.Close()の後にはfs = Nohingにするか、
try内のfs.Closeはコメントアウトした方がよいのではないでしょうか?
CloseしたfsをまたCloseしてもエラーにならないのかという疑問があります。
(これがアクセス拒否エラーの原因ではないですよね?)
引用返信 編集キー/
■58375 / inTopicNo.8)  Re[3]: FileStreamのアクセス拒否について
□投稿者/ 魔界の仮面弁士 (2149回)-(2011/03/31(Thu) 17:21:53)
2011/03/31(Thu) 17:23:18 編集(投稿者)

No58372 (yamada さん) に返信
> 以下のようになっております
今回のコードも先のコードも、スペルミスや、データ型の取り違いなどが見受けられます。

問題の発生しているコードから抜粋するのではなく、掲示板に投稿するものとまったく同一の
「現象を再現させるための最低限のコード」を『新規プロジェクト』に記述してみてください。
コピー & ペーストだけで動くコードを提示した方が、第三者にも検証しやすくなりますから。
(念のため、Option Strict On で処理できるコードの方が望ましいです)

もし、新規プロジェクトでは発生しないようであれば、掲示板に記述していない箇所を
疑ってみた方が良いでしょう。


> If System.IO.File.Exists(strFullPath & strFileName) = Treu Then
> fs = New FileStream(strThumbnail_FullPath & strFileName, FileMode.Open, FileAccess.Read)
Exists 判定しているパスと、FileStream で開いているパスが異なりますが、
両者は別のファイルなのでしょうか?

> Dim readBytes As Long = fs.Read(btBUF, 0, fs.Length)
Dim readBytes As Integer = fs.Read(btBUF, 0, CInt(fs.Length))
なのでは。

> If Not (fs Is Nothing) Then
Close 処理が 2 回行われている点が気になります。
それと、Close 前に Nothing 判定を行うのであれば、
2 回目のループ処理の前に、fs に Nothing をセットしなおすべきかと。
引用返信 編集キー/
■58376 / inTopicNo.9)  Re[4]: FileStreamのアクセス拒否について
□投稿者/ yamada (4回)-(2011/03/31(Thu) 17:23:27)
矢沢様
nothingとCloseの件、了解いたしました。
End Try後に fs = nothingを入れておきました。

エラーの方は相変わらず出てしまいます。
引用返信 編集キー/
■58378 / inTopicNo.10)  Re[4]: FileStreamのアクセス拒否について
□投稿者/ yamada (5回)-(2011/03/31(Thu) 17:25:50)
魔界の仮面弁士 様

取り急ぎ抜粋したため、申し訳ありませんでした
新規のプロジェクトで用意しなおしてみます
引用返信 編集キー/
■58379 / inTopicNo.11)  Re[5]: FileStreamのアクセス拒否について
□投稿者/ todo (131回)-(2011/03/31(Thu) 17:31:50)
同じエラーメッセージということで
http://bbs.wankuma.com/index.cgi?mode=al2&namber=57308&KLOG=96
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -