使用system.io.file类删除文件后:
System.IO.File.Delete(openedPdfs.path);
如果文件被成功删除,我需要运行一些代码。 只要该方法没有返回任何值,我正在检查删除方法后文件是否存在。如果它仍然存在,我认为操作失败了。
问题是,删除方法工作正常,但要删除文件需要几秒钟。 Exist函数返回true,因为在检查文件时是否存在。
如何验证System.IO.File.Delete(openedPdfs.path);
是否成功完成?
代码:
FileInfo file = new FileInfo(openedPdfs.path);
System.IO.File.Delete(openedPdfs.path);
if (file.Exists == false)
{ ... }
else
{ ... }
答案 0 :(得分:12)
正如其他人所指出的那样,File.Delete
方法会在出现故障时抛出异常。
他们忽略了指出的是,几乎所有情况都会抛出异常,但并非在所有情况下。具体来说,如果要删除的文件不存在,File.Delete
方法将不抛出异常。 (Duh?他们在想什么?)
因此,您应该检查文件是否存在之前以删除它;如果它不存在,你不应该做任何事情。如果存在,则应调用File.Delete
,如果抛出异常,则再次执行任何操作,因为文件未被删除。否则,您应该成功删除现有文件。
答案 1 :(得分:3)
Delete
应该抛出异常。因此,您对Exists
的调用是多余的。
答案 2 :(得分:1)
这是Daniel A. White的回答:我们可以看到the signature for the method是public static void Delete(string path)
。很明显,除了异常之外,你不会从Delete调用中获得反馈。但是,假设您有一个文件可以由另一个进程定期编写或更新:
file.Exists
测试是否存在。有一个具有相同名称的新文件,因此返回true。你在技术上走错了路。 对于您当前尝试解决的问题,这种确切的情况可能并非如此,但检查Delete调用是否引发异常比依赖当前实现要强大得多。
答案 3 :(得分:0)
如果文件不存在,它不会抛出异常。如果出现错误,如果无法删除则会抛出异常,请检查File.Delete
答案 4 :(得分:0)
您可以随时使用
System.IO.File.Exists(path)
虽然我同意丹尼尔的意见,但如果删除不会引发异常,那么你应该是好的。
答案 5 :(得分:0)
根据评论和建议,您应该能够使用以下内容来实现您想要的结果
try {
FileInfo file = new FileInfo(openedPdfs.path);
System.IO.File.Delete(openedPdfs.path);
// if no exception is thrown then you should assume all has gone well and put
// your file successfully deleted code here.
} catch /*(Specfic exceptions can be referenced here in separate catch blocks see Daniel A. White answer)*/ {
// If something bad happened and the file was not deleted put handling code here
} finally {
// if some action needs to be taken regardless of whether the file was successfully deleted or not put
// that code here
}
答案 6 :(得分:0)
我发现如果使用FileInfo Delete()实例方法,则不会更新FileInfo实例属性Exists。
例如,以下代码将抛出未找到文件的异常,因为该文件已被删除但第二个if (output_file.Exists)
仍然计算为true。
FileInfo output_file;
if (output_file.Exists) output_file.Delete();
FileStream fs;
if (output_file.Exists)
{
fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}
我发现从旧版本创建一个新的FileInfo解决了这个问题:
FileInfo output_file;
if (output_file.Exists)
{
output_file.Delete();
output_file = new FileInfo(output_file.FullName);
}
FileStream fs;
if (output_file.Exists)
{
fs = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite);
}
else
{
fs = new FileStream(fi.FullName, FileMode.CreateNew, FileAccess.ReadWrite);
}
答案 7 :(得分:0)
private String del(String fileLocation) {
if (File.Exists(@fileLocation)) {
try {
File.Delete(@fileLocation);
} catch (Exception e) {
return "File couldn't be deleted because: " + e.GetType().Name;
}
} else {
return "File doesn't exist";
}
return "File successfully deleted";
}