所以我刚刚注意到:
// this file exists
var fi = new FileInfo(@"S:\Ome\File.path");
// here fi.Exists == true
fi.Delete();
// still fi.Exists == true
fi.Refresh();
// finally fi.Exists == false
我编写的代码假设Delete()
更改了Exists
,并且失败非常意外。检查了实际的source code,发现Delete()
的实现方式为:
public override void Delete() => FileSystem.DeleteFile(FullPath);
代替:
public override void Delete()
{
FileSystem.DeleteFile(FullPath);
Invalidate();
}
如果此简单操作成功,为什么不更新Exists
?另一方面,MoveTo
将fi
对象更改为完全更新为新路径。因此,如果您进行Delete()
,则需要在Refresh()
良好的情况下继续使用MoveTo()
(即使Move()
返回一个新值会更好) FileInfo
以及新的详细信息)。
设计上是否存在这种不一致之处,并且有原因吗?最后,这无关紧要,因为您只需要在Refresh()
之后添加Delete()
,但是我觉得这很不直观。
答案 0 :(得分:1)
有一个简单的答案: Microsoft删除后忘记设置属性。简单。
删除就像这样。删除并返回!
if (Win32Native.DeleteFile(this.FullPath))
return;
他们忘记通知主要对象删除。
if (Win32Native.DeleteFile(this.FullPath))
{
this._dataInitialised = -1;
return;
}