Excelで開かれているテキストファイルのすべての行を、IO例外を受けずにstring[]
に読み込むにはどうすればよいですか?Excelで開いているファイルでFile.ReadAllLinesを実行するにはどうすればよいですか?
私はそこに何があるか使用することができます方法を知りませんが答えの一部である可能性があり、この質問は、あります: How do I open an already opened file with a .net StreamReader?
Excelで開かれているテキストファイルのすべての行を、IO例外を受けずにstring[]
に読み込むにはどうすればよいですか?Excelで開いているファイルでFile.ReadAllLinesを実行するにはどうすればよいですか?
私はそこに何があるか使用することができます方法を知りませんが答えの一部である可能性があり、この質問は、あります: How do I open an already opened file with a .net StreamReader?
問題は、Excelがファイルを読み取り/書き込みとして開きます。 File.ReadAllLines()
は、別のアプリケーションで書き込み用に開いているときにファイルにアクセスできません。 Excelでcsvを読み取り専用として開いた場合、この例外は発生しません。
これは、.Netの実装では、別のアプリケーションに書き込みアクセス権があるときにファイルにアクセスするための適切なアクセス権を持つ内部ストリームが開かれないためです。
ここでの修正は単純なので、基礎となるStream
を開始するときに適切なアクセス許可を設定する独自のReadAllLines()
メソッドを記述してください。ここで
ReadAllLines()
が独自に何から重く借り考えです:
public string[] WriteSafeReadAllLines(String path)
{
using (var csv = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var sr = new StreamReader(csv))
{
List<string> file = new List<string>();
while (!sr.EndOfStream)
{
file.Add(sr.ReadLine());
}
return file.ToArray();
}
}
これとの唯一の違いFileShare
許可は、ファイルを開くことを可能にするFileShare.ReadWrite
に設定されているものReadAllLines
がないです別のアプリケーションで読み取り/書き込みの権限を持っている場合でも、
これで発生する可能性がある問題を理解する必要があります。これは、別のアプリケーションがファイルへの書き込み権限を持っているため、複雑になる可能性があるためです。
System.IO.IOException
がスローされます。。 (これは.Net 4.5の実装であるため、.Netの相違点のバージョンを見ていると多少異なる場合があります)。
これはFile.ReadAllLines()
が実際にどのように見えるかです:
public static string[] ReadAllLines(string path)
{
if (path == null)
throw new ArgumentNullException("path");
if (path.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
else
return File.InternalReadAllLines(path, Encoding.UTF8);
}
private static string[] InternalReadAllLines(string path, Encoding encoding)
{
List<string> list = new List<string>();
using (StreamReader streamReader = new StreamReader(path, encoding))
{
string str;
while ((str = streamReader.ReadLine()) != null)
list.Add(str);
}
return list.ToArray();
}
そして、何StreamReader
が内部的に行っていることで覗いする:
internal StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool checkHost)
{
if (path == null || encoding == null)
throw new ArgumentNullException(path == null ? "path" : "encoding");
if (path.Length == 0)
throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
if (bufferSize <= 0)
throw new ArgumentOutOfRangeException("bufferSize", Environment.GetResourceString("ArgumentOutOfRange_NeedPosNum"));
this.Init((Stream) new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost), encoding, detectEncodingFromByteOrderMarks, bufferSize, false);
}
そこでここでは、とき、例外がスローされた理由に来ますStreamReader
は、パラメータがRead
に設定されたFileStream
を作成します。つまり、ファイルへの読み取り/書き込みアクセス権を持つ別のアプリケーションとファイルを共有することはできません。この動作を無効にするには、FileShare
の設定が異なるStream
を指定する必要があります。これは上記の解決方法で行ったものです。
これは非常に意味があり、今はそれがうまくいくと私は信じています。 – user1306322
@ user1306322それは私のために働いた。私はちょうど私がExcelで開いていたあなたの質問を見つけたCSVを読むことと同じ正確な問題に遭遇しましたが、回答で満たされなかったので、これは私がそれをどうやってslovedしたかです。だから、あなたが合併症を持っているなら(私が言及したものを除いて)、私に教えてください。 – psubsee2003
はこれを試してみてください。
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,
System.IO.FileShare.ReadWrite)
これで 'string [] lines = something.ReadAllLines(myPath)'をどうすればいいですか? – user1306322
テキストファイルから行を読み込むためにファイルストリームが必要なのかどうかわかりません。これを行う他の方法はありますか? – user1306322
読み取り制限付きで開いている場合にのみファイルを開くことはできません。そうしないと、ReadAllLines
を含むすべてのメソッドが許可例外をスローすることなく動作します。
リンク先の回答がわからないそれはかなり明確です。あなたはそれを試しましたか?あなたのコードを表示します。 – Polyfun
'string [] lines'にテキストファイルの行を入力するには、このコードをどうすればいいですか?そこには何もありません。 – user1306322
http://stackoverflow.com/questions/3560651/whats-the-least-invasive-way-to-read-a-locked-file-in-c-sharp-perhaps-in-unsaf – m0s