ここでの元の関連する質問 ( https://stackoverflow.com/questions/17332403/is-there-such-ac-sharp-method-or-methodology-that-would-equate-to-filealready ) は、重複としてマークされました。そして、私は問題を解決しようとするために、想定される重複(ファイルが使用されているかどうかを確認する方法はありますか?)を使用しましたが、一部のファイルI / O操作でまだNull参照例外が殺到しています。
昔のハルシオンの投稿に基づいて、以前のコードを次のように変更しました。
public FileQuickRead(string filename)
{
try
{
SR = File.OpenText(filename);
}
catch (Exception ex)
{
CCR.ExceptionHandler(ex, "FileQuickRead.FileQuickRead");
}
. . .
...これに:
public FileQuickRead(string filename)
{
// Added 6/27/2013; adapted from https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use
try
{
using (Stream stream = new FileStream(filename, FileMode.Open))
{
try
{
SR = File.OpenText(filename);
}
catch (Exception ex)
{
CCR.ExceptionHandler(ex, "FileQuickRead.FileQuickRead");
}
}
}
catch (Exception exc)
{
// If the "using Stream filename" fails
#if TRACE
UtilCE.LogInfo.Add2LogFile(string.Format("Catch block in FileQuickRead caught: {0}", exc.Message));
#endif
}
}
...ログファイルには「キャッチブロック」文字列が含まれていないため、「使用中のファイル名」を超えていますが、明らかに File.OpenText() の呼び出しに失敗しています。
また、クラスの他の 2 つのメソッド、つまり ReadLn と FileClose で失敗しています。
public string FileReadLn()
{
try
{
aLine = SR.ReadLine();
}
catch (Exception ex)
{
CCR.ExceptionHandler(ex, "FileQuickRead.FileReadLn");
}
return aLine;
}
public void FileClose()
{
try
{
SR.Close();
}
catch (Exception ex)
{
CCR.ExceptionHandler(ex, "FileQuickRead.FileClose");
}
}
FileQuickRead、FileReadLn、FileClose で NullReferenceException が 3 回連続して発生します。
クラス内の他の唯一のものは、これらのグローバル宣言です。
private StreamReader SR;
private string aLine;
呼び出し元は次のようにします。
fileQuickRead = new FileQuickRead(fn);
// Read the line from the file*
aLine = fileQuickRead.FileReadLn();
. . .
while ((aLine != null) && (aLine != ""))
. . .
aLine = fileQuickRead.FileReadLn();
if (aLine == null)
continue;
. . .
finally
{
fileQuickRead.FileClose();
}
FileClose() メソッドの SR.Close() では不十分ですか? ファイルを完全にフラッシュするために何かをする必要がありますか、それとも...???
- 素晴らしい - プロジェクト全体で唯一のコメントであり、痛々しいほど明白なことだけを漏らします。