因此,如果以我直接使用kernel32删除文件为例,是否可以替代此C#API?
System.IO.File.Delete(string Path);
如果我像这样导入dll并仅使用DeleteFile(“ C:..”):
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool DeleteFile([MarshalAs(UnmanagedType.LPWStr)]string lpFileName);
效率会更好吗,例如执行代码所需的时间?
最佳答案
常见的误解是托管代码很慢。通常,您执行的不是C编译器生成的相同类型的代码,即机器代码。与大量作为操作系统功能包装器的.Net框架类尤其无关。
就像File类一样。实际上,File.Delete()方法调用DeleteAPI()winapi函数。因此,这是在Windows上删除文件的唯一方法。 .NET框架无能为力,至少在托管操作系统可用之前是无能为力的。实际上可能有一天会发生,微软的超级秘密Midori项目旨在开发这种操作系统。
但这是未来音乐,现在它是一大堆C代码,埋在文件系统驱动程序中,例如Fat32或NTFS,实际上可以完成工作。它以磁盘速度运行,在文件系统驱动程序确认删除完成之前,DeleteFile()不会返回。这非常非常慢。就像老式硬盘驱动器大约50毫秒一样,固态硬盘在不到毫秒的范围内。
File.Delete()确实添加了代码,它执行许多错误检查。如果验证您传递的参数不为null,请检查代码是否未在拒绝文件删除权限的沙箱中运行,请检查您是否在路径中未指定任何在文件路径中不合法的字符,将增量路径转换为完整路径,并检查它仍然是合法路径,检查路径字符串是否不太长,如有必要,将短MS-Dos 8.3名称转换为长名称。
这是很多工作,但以微秒为单位。如果您锁定DeleteFile,那么您将跳过该代码,但最多只能使其快1%。您将失去的是可靠性,即如果您在代码或数据中遇到麻烦,则会确保将被告知可靠性。带有非常清晰的异常消息,告诉您确切的错误。这非常有价值,因为那几微秒乘以十亿仍然无法满足您所花费的时间和痛苦,因为调试DeleteFile()无效。
不要这样