|
■No92440 (あお さん) に返信 > 以下の構文でCSVファイルを読み込んで、閉じています。 > Dim StReader1 As New System.IO.StreamReader(TextBox1.Text)
New System.IO.StreamReader(TextBox1.Text) という呼び出しは、 New System.IO.StreamReader(TextBox1.Text, Encoding.UTF8, True, 1024) な呼び出しと同義ですね。
Shift_JIS や ASCII ではなく、UTF-8 な CSV ファイルという認識で良いでしょうか。
> というメッセージが出ました。
何が原因でしょうね。 ネットワークパスなどは用いず、ローカル HDD 上のパスを指定してみましたが、 現象を再現できませんでした。当方では問題なく閉じられています。
UAC 絡みかと思い、マニフェストで VirtualStore の有効化/無効化を 切り替えつつ、仮想化されるパスを参照させてみましたが、やはり再現しません。
> Close処理はしているのですが、何が問題なのでしょうか?
LeaveOpen モードで開いた場合に限り、StreamReader を Close あるいは Dispose したとしても、 ファイルが開きっぱなしの状態となりえます。しかしそれは、今回のケースには当てはまりません。 元質問のコードのみなら LeaveOpen は常に False 状態であり、Close 後、即座に閉じられるはず…。
ファイルパスの間違いというわけでも無さそうですし、今のところ、 (1) 同じファイルが、他の箇所(あるいはセキュリティ系のソフトなど)でも同時に開かれていた。 (2) 何らかの理由で Close されていない。 ぐらいしか思い当たらないです。
確認のため、 ' 一時ファイルにコピー Dim tmp As String = System.IO.Path.GetTempFileName System.IO.File.Copy(TextBox1.Text, tmp) ' コピーを開く Dim StReader1 As New System.IO.StreamReader(tmp) While (StReader1.Peek() >= 0) StReader1.ReadLine() LineCount = LineCount + 1 End While StReader1.Close() ' 一時ファイルを処分 System.IO.File.Delete(tmp) のようにしてみては如何でしょうか。試していませんけど。
一時ファイルから読み込んでいるなら、元ファイルが開かれたままになることも無いと思います。
また、ファイルコピーで失敗するようであれば、他の場所で同時に開かれていた可能性が浮上します。 一時ファイルを Delete できなかったとすると、セキュリティソフト等による阻害の可能性があるかも。
> 実際に読み込んだCSVファイルを手動で開いて保存しようとすると「ファイルの保存中にエラーが発生しました。
何の解決にもならないですが、手動で保存できれば良いだけなら、 Dim StReader1 As New System.IO.StreamReader(TextBox1.Text) のかわりに、 Dim StReader1 As New System.IO.StreamReader(New System.IO.FileStream(TextBox1.Text, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite)) にすれば、排他制御が廃され、Close される前でも外部から書き込み可能となります。
|