如果你不了解本文的内容,可能会在未来某个时候踩坑–你可能在判断文件夹是否存在的时候得到错误的返回值。
删除文件(夹)
使用 .NET 带的删除文件夹的方法:
1
Directory
.Delete("D:\walterlv");
或者使用其他删除文件(夹)的方法,大多数是以下 Windows API 的封装:
1
BOOL DeleteFile(
LPCTSTR lpFileName
BOOL RemoveDirectoryA(
LPCSTR lpPathName
BOOL RemoveDirectoryW(
LPCWSTR lpPathName
于是,大多数删除文件(夹)的代码都会遇到问题: 文件或文件夹可能没有立即删除 !
测试程序
1
using System;
using System.IO;
class Program
static void Main(string[] args)
var dirPath = @"C:\Users\lvyi\Desktop\Test";
while (true)
Console.WriteLine(Directory.Exists(dirPath));
Directory.CreateDirectory(dirPath);
Directory.Delete(dirPath);
你猜会输出什么?每一行都输出
False
吗?
然而实际上是:
嗯……会混入少量的
True
在里面。这是不是有点“不符合预期”?
原因
删除文件夹的本质方法
RemoveDirectory
在微软的官网中就已经解释了:
The RemoveDirectory function marks a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.
RemoveDirectory函数将标记一个文件夹在关闭后删除。这意味着在最后一个此文件夹的句柄关闭之前,此文件夹将一直不会删除。
所以调用完删除文件夹的方法后,仅仅只是标记这个文件夹要删除而已。那么随后立即获取此文件夹是否存在,将取决于前面调用删除后是否真的删除了文件夹。
删除文件的本质方法
DeleteFile
也有类似的解释:
The DeleteFile function marks a file for deletion on close. Therefore, the file deletion does not occur until the last handle to the file is closed. Subsequent calls to CreateFile to open the file fail with ERROR_ACCESS_DENIED.
DeleteFile函数将标记一个文件在关闭后删除。这意味着在最后一个文件句柄关闭之前,此文件将一直不会删除。如果随后立即调用CreateFile来打开一个文件的话可能会遭遇错误ERROR_ACCESS_DENIED。
解决方法
因此,不要再依赖于判断文件夹是否存在来决定某个业务。例如,可以考虑创建文件夹之前不判断文件夹是否存在:
1