另一个应用程序锁定文本文件,最简单的方法是什么?

47

我一直在使用File.ReadAllText()打开CSV文件,但每次在Excel中忘记关闭文件时,应用程序会抛出异常,因为它无法访问该文件。

(对我来说似乎很疯狂,毕竟ReadAllText中的READ看起来非常清晰)

我知道有File.Open和所有花里胡哨的东西,但是否有一种“中间”方法不涉及缓冲区和char数组的操作?

2个回答

70

我认为你只是想要以下内容:

using (var fileStream = new FileStream("foo.bar", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var textReader = new StreamReader(fileStream))
{
    var content = textReader.ReadToEnd();
}
 
FileAccess.Read参数很重要,它表明您只想读取文件。当然,即使这样做,文件也必须在Excel中以“read-share”模式打开(请参见.NET中的FileShare枚举)。尽管我希望如此,但我没有测试过Excel是否会这样做。

[编辑] 这是一个方法版本:

static string ReadAllText(string file)
{
    using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (var textReader = new StreamReader(fileStream))
    return textReader.ReadToEnd();
}

谢谢,我可以在{}之间放置什么最短的代码来从文件中获取整个字符串?(我说过我很懒) - Benjol
@Noldorin,谢谢。那就是缺失的环节。我查看了FileStream上所有可用的方法,但无法理解。 - Benjol
5
@Noldorin:提供信息,我试过了,你必须包括FileShare.ReadWrite参数才能使它与Excel配合使用。 - Benjol
@Benjol:啊,我想这很有道理。无论如何,知道这点还是不错的。 - Noldorin

1

如果您想指定文件共享标志以打开正在使用的文件,则只能使用File.Open()。


1
这是Excel打开文件,所以OP无法控制。他只能希望Excel以读共享模式打开它,并自己以只读模式打开它。 - Noldorin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接