下面是一个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace filetest
{
class Program
{
static void Main(string[] args)
{
string testString = "Test File";
string testFileName = Guid.NewGuid().ToString() + ".txt";
string storagePath = "Z:";
File.WriteAllText(storagePath + "\\" + testFileName, testString);
string input = File.ReadAllText(storagePath + "\\" + testFileName);
File.Delete(storagePath + "\\" + testFileName);
Console.WriteLine("Complete");
Console.ReadKey();
}
}
}
其中Z:是Map到另一台机器或NAS的驱动器。运行此代码时,在File.ReadAllText行上出现异常:
System.IO.IOException: The process cannot access the file 'Z:\4c639f96-12a9-410d-94a0-ffc6392aa85a.txt' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean checkHost)
at System.IO.File.InternalReadAllText(String path, Encoding encoding, Boolean checkHost)
at System.IO.File.ReadAllText(String path)
at Switchvox_VM_Handler.Controllers.FaxController.TestWriteStorageLocation(FaxStorage storage) in D:\tfs2017\Switchvox-VM-Handler\Switchvox-VM-Handler\Controllers\FaxController.cs:line 327
此外,该文件虽然可以在记事本中打开,但在运行此代码的计算机重新启动之前无法删除。结束进程不足以释放锁定。锁定将永远保留。
我在.NET Framework 4.7、4.72、4.81中看到过这种情况。同样的代码在重写到.NET 6时不会导致这种异常。
对我来说,这看起来像是遗留的.NET框架的一个bug,但也许我遗漏了一些东西。我已经将它简化到了这个SO问题的最低限度,并验证了它仍然抛出相同的异常,即使是10行控制台项目。我花了时间打破了使用streamwriter语句等传统使用方式的写作。但是结果是一样的。另外,如果我用File.Copy命令替换File.WriteAllText,并将现有的文本文件复制到相同的位置,该文件将以相同的方式锁定。
最后,如果驱动器盘符Z:与本地驱动器号交换,即C:正如人们所期望的那样,它工作得非常好。它似乎只是网络共享(SMB/CIFS)的问题。
关于如何解决这个问题的任何想法,因为我还没有真正准备好在.NET 6(核心)中重写这个项目。
1条答案
按热度按时间dbf7pr2w1#
我一直有一个WinFrom应用程序,我一直在更新相同的问题...我发现断开和重新连接Map的网络驱动器释放文件,而无需重新启动,但这个文件仍然被锁定。最初的应用程序是为.Net 4.7编程,但我已经将目标框架设置为. Net6和.Net7和我仍然有锁定文件的问题“文件正在使用的另一个进程”应用程序的工作没有锁定文件在其他开发PC的将进一步研究Webroot的可能性