gpt4 book ai didi

c# - 在写入线程安全的同时复制文件吗?

转载 作者:行者123 更新时间:2023-11-30 20:48:40 31 4
gpt4 key购买 nike

正在使用 FileStream写入文件的类和 .NET File.Copy线程安全的同时复制文件的方法?操作系统似乎应该安全地处理对文件的并发访问,但我找不到关于此的任何文档。我编写了一个简单的应用程序进行测试,但看到了奇怪的结果。该文件的副本显示为 2MB,但当我用 Notepad++ 检查文件内容时,它里面是空的。原始文件包含数据。

using System;
using System.Threading.Tasks;
using System.Threading;
using System.IO;

namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string filePath = Environment.CurrentDirectory + @"\test.txt";
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
Task fileWriteTask = Task.Run(() =>
{
for (int i = 0; i < 10000000; i++)
{
fileStream.WriteByte((Byte)i);
}
});

Thread.Sleep(50);
File.Copy(filePath, filePath + ".copy", true);
fileWriteTask.Wait();
}
}
}
}

感谢您的帮助!

最佳答案

视情况而定。

取决于你所说的“线程安全”是什么意思。

首先,看一下这个构造函数:

public FileStream(string path, FileMode mode, FileAccess access, FileShare share )

注意最后一个参数,它说明了您允许其他线程和进程对文件做什么。适用于没有它的构造函数的默认值是 FileShare.Read,这意味着您允许其他人以只读方式查看文件。如果您正在写信给它,这当然是不明智的。

这基本上就是您所做的,您打开一个文件进行写入,同时允许其他人读取它,而“读取”包括复制。

另外请注意,如果没有这个: fileWriteTask.Wait(); 在你的代码的末尾,你的整个函数不是线程安全的,因为 FileStream 可能在你开始之前就关闭了写作。

Windows 确实使文件访问线程安全,但以一种非常重要的方式。例如,如果您使用 FileShare.None 打开文件,它会崩溃 File.Copy 并且据我所知,没有一种优雅的方式来用 .Net 做这件事。 Windows 用于同步文件访问的一般方法称为乐观并发,意思是假设您的操作是可能的,如果不是则失败。

this question discusses waiting for file lock in .Net

在进程之间共享文件是一个常见问题,其中一种方法主要用于进程间通信 memory mapped files这是 the MSDN documentation

如果您有勇气并愿意尝试使用 WinAPI 和 Overlapped IO,如果我没记错的话 LockFileEx允许很好的文件锁定...

还有,曾经有一个神奇的东西叫Transactional NTFS但它已经进入了 Microsoft Deprecated Technologies 领域

关于c# - 在写入线程安全的同时复制文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24377738/

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