我无法找到这个问题的答案,也不确定如何测试。
如果我有以下两行;
TextWriter tw = new StreamWriter(txtPath,true);
File.Copy(OriginalPath, DestinationPath));
tw.WriteLine("blah");
第3行是否等到File.Copy完全完成,或者File.Copy还在运行时是否可以启动第3行?
答案 0 :(得分:10)
是的,它会等待,因为File.Copy()
是同步方法调用/文件复制操作。
您可以免费下载适用于Windows桌面的Visual Studio 2013 Express Edition,以测试此C#代码。 Download link
在Visual Studio中创建一个新的控制台应用程序项目,并在Main()
方法声明中运行您的代码。如果您使用代码复制5-10GB文件,您会注意到Copy()
方法的调用需要一些时间才能返回。
答案 1 :(得分:7)
我不清楚为什么要问这个问题,但是File.Copy
是一个“同步”方法 - 所以在操作系统认为复制文件之前它不会返回。但是,请注意,因为根据执行复制的驱动器,写入可能会被缓存而不能完全写入磁盘。该磁盘上的后续操作将考虑到这一点(例如,如果您然后尝试将第一个目标复制到新目标,那将起作用);但如果在File.Copy
返回后磁盘断电,可能没有将所有数据写入磁盘。这是某些SSD驱动器的一个特殊问题。
答案 2 :(得分:3)
该框架通常设计得很好。如果特定方法在返回时不会完成其工作,它将返回一些您可以确定操作何时完成的内容(即Task
,Task<T>
或{{ 1}})
IAsyncResult
是一个File.Copy
方法,什么都不返回,所以期望它在返回时完成了它的工作。
答案 3 :(得分:1)
根据ILSpy,File.Copy
method在内部调用Win32 CopyFile
function,而后者又是同步函数。
所以在我看来,它完全同步,而不是异步。因此,文件完全复制后,您的第3行称为。