• ベストアンサー

ファイル読み込み時のエラー回避

VB2010のプログラムで、ファイルを読み込む際に「System.IO.File.ReadAllLines」を利用していますが、そのファイルが他で使用されている場合に「別のプロセスで使用されているため、...」というエラーが発生していしまいます。 他でオープンされていてもエラーを発生させず開く方法はないでしょうか。 なければ、回避方法などを教えていただけるとありがたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

http://www.atmarkit.co.jp/fdotnet/dotnettips/707shareread/shareread.html Imports System.IO Imports System.Text Public Class Class1  Public Shared Sub Main()   Dim l_strPath As String = "C:\test.csv"   Dim ss As String() = ReadLines(l_strPath)   For Each s As String In ss    Console.WriteLine(s)   Next  End Sub  Public Shared Function ReadLines(ByVal p_strPath As String) As String()   'SJIS   Return ReadLines(p_strPath, Encoding.GetEncoding(932))  End Function  Public Shared Function ReadLines(ByVal p_strPath As String, ByVal p_enc As Encoding) As String()   Dim l_aryLines As New List(Of String)   '共有モードでオープン   Using l_fs As New FileStream(p_strPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)    Using l_sr As New StreamReader(l_fs)     l_aryLines.AddRange(Strings.Split(l_sr.ReadToEnd(), ControlChars.CrLf))    End Using   End Using   '最終ラインの空文字を除外したい場合   If (l_aryLines.Count > 0) AndAlso (String.IsNullOrEmpty(l_aryLines.Item(l_aryLines.Count - 1))) Then    l_aryLines.RemoveAt(l_aryLines.Count - 1)   End If   '結果を返却   Return l_aryLines.ToArray()  End Function End Class

hatena13
質問者

お礼

実際に対応方法を記述していただきありがとうございます。 何か一文挟めば、読み取り専用のような開き方があるのかと期待していたのですが、甘かったようですね。 このやり方を試してみたいと思います。 ありがとうございました。

その他の回答 (1)

回答No.2

回避案 1.上記理由でioエラーになったファイルをコピーして、コピー先のファイルを読み込むように操作する 2.FileOpenのOpenModeにInput(入力モード)を指定し、読み込む。 3.上記ioエラーを検出した場合、エラーになったファイルの属性を強制的に解除し(ファイルロックを解除)ファイルを読み込む。 上記方法は、読み込んだファイルをその後どうしたいのかにより、方法は変わってくると思いますが基本的にロック中のファイルを読み込み更新等行なった場合、元のファイルの情報は保証するれなくなることに注意してください。 なお、ソースは上記分中の言葉およびキーワードとして「vb.net」を含めることにより例がみつかることと思います。 なお、上記方法は論理的には行けると思いますが試してないので確認してみてください!。

hatena13
質問者

お礼

ネットでいろいろ調べたのですが、よい回避方法が見つからなかったもので。。。 やはり、このやり方ではすんなりはできないようですね。 ありがとうございました。

関連するQ&A

  • すでにファイルが開かれている時のエラー回避

    VB2010で、ファイルを開いていると下記のコードでエラーがでます。 Dim SR As New System.IO.StreamReader(AppPath & "諸元一覧.csv", System.Text.Encoding.Default) 「諸元一覧.csv」ファイルを閉じてください。 とメッセージを出し、ExitSubしたいのですが、 どういうコードにすればよいのでしょうか。 教えてください。よろしくお願いいたします。

  • C# ファイル削除のエラーコード

    言語:C# の質問です。(初心者 初めて1週間)  ファイルの削除を行った際に、別プロセスが使用中で、 削除できなかった場合に対して、別処理を行いたいです。  ファイルが削除できない場合は、エラーを取得することができるのですが、  別プロセスが使用中のみの制御を入れたいと思っています。  VB6では、ファイル削除(Kill)ができなかった場合に、 エラーコードを返して、該当するエラーコードのみに 別処理を行うことができていました。  それと同じことを、C#でも行いたいです。 処理としては、 1.ファイルの削除を行う 2.ファイルの削除が出来なかった場合に対してのみ、  別処理を入れる  (別プロセスが使用中のため削除できないファイルに対して)  このような処理を行いたいのですが、 ファイルが削除できなかった場合の、エラーコードを 求め方を色々調べてみたのですが、見つかりません。 下記ソースで、プログラムを作成中です。 try{    System.IO.File.Delete(@削除するファイル名); } cach(System.IO.IOException) {   //ここでエラーコードを取得し、該当するエラーコードのみに   //対して、別処理を入れたい   MessageBox.Show(err.Message); }   MessageBox.Show(err.Message);   ↑   もし、エラーコードが取得できないのであれば、  このエラーメッセージ文章に対してリテラルで制御をいれる  ことも考えています。 どうか、ご教授ください。 よろしくお願いいたします。

  • ExcelVBAでファイルを開く時に使用中のファイルでないか調べる方法を教えてください。

    ExcelVBAの勉強を始めて間もない者です。 Office2000のExcelでマクロを作成しています。 テキストストリームオブジェクトを作成してファイルを開き、 ファイルの内容をセルに展開するプログラムを書いているのですが、 開こうとしているファイルが他のプロセスで開かれているかどうかを調べる方法はありませんか? Openステートメントを使用すればロックをかけることができるので、 エラーを発生させることができるみたいなのですが、 テキストストリームオブジェクトを使用してファイルを開いている場合に 開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。 説明がわかりにくいとは思いますがよろしくお願いします。

  • 2008で「別のプロセスで使用されているため、プロセスはファイル'○○○' にアクセスできません

    VB2008初心者です。 System.IO.StreamReaderを使って、あるテキストファイルを1行ずつ読み込み、それを配列に格納し、配列データを修正したうえで、次にSystem.IO.StreamWriterを使って同じテキストファイルに配列のデータを書き込むというプログラムを組んでいます。 ところが、ビルドすると「別のプロセスで使用されているため、プロセスはファイル 'C:\Management Student\personal.txt' にアクセスできません。」というメッセージが表示されてしまいます。 このメッセージの原因と対処方法をご存知の方、教えていただけないでしょうか。

  • 「コンパイルエラー:プロシージャが大きすぎます。」を回避するには。

    「コンパイルエラー:プロシージャが大きすぎます。」を回避するには。 VB初心者です。 上記のようなコンパイルエラーが発生してしまいます。 現状のまま、上記エラーを回避する方法はあるでしょうか。 どなたかご教授願います。

  • 排他ロックが掛かっているファイルを読み込む

    排他ロックが掛かっている(別のプロセスが使用している) テキストファイルを読み込みたいのですが、 System.IO.FileStreamを実行した後に、IOExceptionエラーが発生し、 読み込みができません。 System.IO.FileStreamにはこだわってませんので、 排他ロックが掛かっているテキストファイルを読み込む方法を ご存知の方は、ご教授頂けませんでしょうか。 宜しくお願いします。 <ソースコード> 'ファイルパス wFullPath = "\\XXX.XXX.XXX.XXX\TEXT\TEST.TXT" (XXX.XXX.XXX.XXX:IPアドレス) 'ファイルを開く Dim fs As New System.IO.FileStream(wFullPath, _ System.IO.FileMode.Open, _ System.IO.FileAccess.ReadWrite, _ System.IO.FileShare.ReadWrite) 'FileStreamを基にしたStringReaderのインスタンスを作成 Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding("shift_jis") Dim sr As New System.IO.StreamReader(fs, enc) 'ファイルの内容をすべて読み込む Dim s As String = sr.ReadToEnd() <開発環境> 言語:VB.NET Microsoft Visual Studio 2008 Microsoft .NET Framework Version 3.5 SP1

  • ExcelVBA ファイルオープン時に使用中でないか調べる方法

    [技術者向] コンピューター > プログラミング > その他(プログラミング) でも質問させて頂いたのですが URL:http://oshiete1.goo.ne.jp/qa3166356.html 回答を得ることができず、こちらのカテゴリを勧められた為、再度質問させて頂きます。 ExcelVBAの勉強を始めて間もない者です。 Office2000のExcelでマクロを作成しています。 テキストストリームオブジェクトを作成してファイルを開き、 ファイルの内容をセルに展開するプログラムを書いているのですが、 開こうとしているファイルが他のプロセスで開かれているかどうかを調べる方法はありませんか? Openステートメントを使用すればロックをかけることができるので、 エラーを発生させることができるみたいなのですが、 テキストストリームオブジェクトを使用してファイルを開いている場合に 開くファイルが他のプロセスで使用してるか調べる方法が知りたいです。 説明がわかりにくいとは思いますがよろしくお願いします。

  • ファイルダイアログを開いた時のキャンセルボタンの処理

    VB2005 ファイルダイアログを開いた時のキャンセルボタンの処理が良く分かりません。キャンセルボタンを押した時の処理が無い為だと思うのですが、【'System.IO.IOException' の初回例外が Microsoft.VisualBasic.dll で発生しました。】というエラーメッセージが出ます。誰かこのエラーをでなくする方法を教えて頂きたいのですが。よろしくお願いします。

  • ASP.NETからファイル書き込むには

    はじめまして。 ASP.NETで開発をしようとしております(まだ初心者で悪戦苦闘中)。 いま、やりたいことが、ブラウザのボタンを押したときに、サーバ内のファイルに書き込みを行うということです。それだけであれば、FileStreamを使用してできました。が、書き込み先のファイルがVC++6.0のプログラムがファイルオープンにしている状態なのです。VC++のプログラムでは、他のプロセスからアクセスできるようにしてはいるんですが、実際ボタンを押して書き込みにいくと、他のプロセスが使用していますというエラーが返ってきます。 なんとか実現させる方法はありませんでしょうか。 何卒よろしくお願いいたします。

  • 実行ファイル

    Visual Studio 2005 (VB) で簡単なプログラムを作りました。 他のPC(VBがインストールされていない) で利用できるように ビルド→「発行」で「Setup exe.」を作成し他のPC(VBがインストールされていない)でクリックするのですが 「必要なファイルのダウンロード中にエラーが発生しました。・・・」詳細「次のリソースがダウンロード中にエラーが発生しました。h..p://go.microsoft.com/frink/?LinkId・・・」となります。 他のPC(VBがインストールされていない。ネットに接続されていません) で利用できるようにする 方法を教えてください。よろしく

専門家に質問してみよう