我正在使用File移除循环中的文件。用最简单的方法删除(字符串(。Net Core控制台应用程序:
1. foreach (var listing in listings)
2. File.Delete(listing.Path);
但是问题是应用程序随机挂在第2行,没有抛出异常。应用程序重新启动后,几个文件被成功删除,应用程序再次随机挂在另一个文件上。
有一些项目需要注意:
listing.Path
是磁盘上文件的绝对路径listing.Path
看起来像D:Output 00000016b1c8e6c-7d83-481a-a7db-aac9024059c4.png
listings
数组的长度约为10项- 文件是否存在
- 存储:Seagate Exos 7E8 512E 8TB 7200rpm 256MB ST8000NM000A 3.5"SATA IIIHDD
- 操作系统:Windows 10 64x
Output
文件夹的总大小210GBOutput
文件夹包含137 000其他文件夹,共有928 000件(- 平均文件大小约为350KB
我怀疑这个问题在某种程度上与文件数量有关。但是File.Delete
应该是删除文件的最可靠的方式,而且它会挂起数小时而没有任何响应。这迫使我终止应用程序的进程是否有更好或更有效的方法删除文件
更新:将所有文件移动到安装了SSD的网络中的另一台Windows机器上并在那里执行应用程序后,它运行得非常好。因此,这看起来可能是一个硬件问题。因此,我将改写如何正确删除中的文件中的问题标题。使用C#的Net Core到如何正确删除中的文件。从包含大量其他文件或文件夹的文件夹中使用C#的Net Core
1(不要期望创建一个包含数十万个文件名的数组,然后在它们之间循环,快速删除它们
2( 文件系统,尤其是当目录位于网络共享、映射驱动器上或正在被另一个应用程序使用时,将是缓慢和阻塞的操作。例如,将新文件尽快添加到目录的处理将与从同一目录中尽快删除文件的处理发生冲突,并可能导致死锁。
3( 文件可能被另一个进程锁定
尝试一些测试a( 获取要删除的所有文件的列表需要多长时间?b( 一行删除1000个文件需要多长时间?
我开发的一个队列系统有大量文件,其中多个进程创建文件,多个进程处理文件,然后删除文件。
我们有3个目录:Inbound、BeingProcessed和ForDelegation
每个新文件都放在Inbound目录中另一个进程会将文件从入站目录移动到BeingProcessed目录,打开并锁定文件,然后处理文件并将文件移动到ForDelete目录另一个进程将删除ForDelegation目录中的文件