gpt4 book ai didi

c# - 为什么在尝试读取正在写入的文件时出现未处理的异常 : System. IO.IOException?

转载 作者:行者123 更新时间:2023-11-30 13:24:39 27 4
gpt4 key购买 nike

我有两个 C# 应用程序,一个正在逐行读取文件(文件 A)并将其内容写入另一个文件(文件 B)。

第二个应用程序正在使用文件 B 的 FileSystemWatcher 查看它何时更新,并报告程序启动时间和文件更改时间之间的行号差异。

这就是我现在想要做的所有事情,最终我想读取文件上次读取时间和当前读取时间之间的行,但直到我可以得到暂停的行差异。

我的应用程序 1 的代码是;

        static void Main(string[] args)
{
String line;

StreamReader sr = new StreamReader("f:\\watch\\input.txt");

FileStream fs = new FileStream("f:\\watch\\Chat.log", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs);

while ((line = sr.ReadLine()) != null)
{
sw.WriteLine(line);
Thread.Sleep(200);
Console.WriteLine(line);
sw.Flush();

}

sw.Close();
sr.Close();

}

应用程序 2 的代码是;

        public static int lines = 0;

public static void Main()
{
Run();
}

public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();

if (args.Length != 2)
{
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];

watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;

watcher.Filter = "Chat.log";

watcher.Changed += new FileSystemEventHandler(OnChanged);

watcher.EnableRaisingEvents = true;

lines = File.ReadAllLines(args[1] + "\\Chat.log").Length;

Console.WriteLine("File lines: " + lines);

while(Console.Read()!='q');
}

private static void OnChanged(object source, FileSystemEventArgs e)
{
Linework(e.FullPath);
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}

public static string Linework(string path)

{



string newstring = " ";

using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
int newlines = File.ReadAllLines(path).Length;
Console.WriteLine("Lines now: " + newlines);
}

return newstring;

}

现在,当我尝试同时运行这两个应用程序时,出现异常,提示“未处理的异常:System.IO.IOException:进程无法访问该文件,因为它正在被另一个进程使用”。

我为 ReadWrite 访问设置了两个文件流,我为 FileAccess.Write 设置了一个文件流,另一个为 FileAccess.Read 设置了文件流。

关于我为什么会收到此异常的任何线索?

谢谢嘿。

最佳答案

lines = File.ReadAllLines(args[1] + "\Chat.log").Length;

这是你的问题。该方法打开文件,读取所有行并再次关闭它。它在打开文件 FileShare.Read 时使用“正常”文件共享设置。这拒绝对也打开了该文件的任何其他进程的写访问。

这在这里行不通,您已经使用写入权限打开了文件。第二个过程不能否认它。 IOException 是结果。

您不能在此处按原样使用 File.ReadAllLines(),您需要使用 FileShare.ReadWrite 打开一个 FileStream,将其传递给 StreamReader 并读取所有行。

当心你在这里遇到的非常麻烦的种族潜力,不能保证你读到的最后一行是完整的一行。仅在行尾获取\r 而不是\n 是一个特别棘手的问题。这将随机且不频繁地攻击最难解决的错误。也许您的 Flush() 调用修复了它,我从来没有足够勇敢地对此进行测试。

关于c# - 为什么在尝试读取正在写入的文件时出现未处理的异常 : System. IO.IOException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3188876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com