Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#复制/移动到锁定的文件/流中_C#_File_Stream_Locking - Fatal编程技术网

c#复制/移动到锁定的文件/流中

c#复制/移动到锁定的文件/流中,c#,file,stream,locking,C#,File,Stream,Locking,我需要有关如何锁定文件、复制文件、修改副本以及将副本保存回原始文件的帮助,同时原始文件保持锁定状态 以下是当前的流程: 用户打开文件,应用程序将其复制到临时文件夹中,并用以下行锁定原始文件 _lockStream = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read); 然后,在将临时文件保存回原始文件时,当前我使用以下例程(destination=_lockStream,source=temp文件

我需要有关如何锁定文件、复制文件、修改副本以及将副本保存回原始文件的帮助,同时原始文件保持锁定状态

以下是当前的流程: 用户打开文件,应用程序将其复制到临时文件夹中,并用以下行锁定原始文件

_lockStream = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
然后,在将临时文件保存回原始文件时,当前我使用以下例程(destination=_lockStream,source=temp文件的流):

我更喜欢使用File.Copy,但我不知道如何使它与锁定的文件一起工作,即使该文件已被应用程序锁定。 更糟糕的是,我的方法是不安全的,如果应用程序或系统在中间崩溃,原始文件就损坏了。我认为更正确的方法是复制到同一个文件夹,然后移动(或者只是简单地移动),但我不知道如何保持对原始文件的锁定

所以,现在为了安全起见,我释放文件锁,使用file.Copy,然后再次获得锁。它可以工作,但在几毫秒内,文件被解锁,并且可以被其他进程锁定


做这些事情的最佳方法是什么?

为了使您的方法安全,您可以像这样使用TransactionScope:

using(var scope = new TransactionScope())
{               
    Copy(source, destination, buffersize);
    scope.Complete();
}

这是行不通的。当我在调试器中的copy方法中停止并退出时,目标流将被部分覆盖。
using(var scope = new TransactionScope())
{               
    Copy(source, destination, buffersize);
    scope.Complete();
}