如果文件(在本地网络驱动器上)已经被使用,在打开之前是否有任何方法可以在.Net中检查?
答案 0 :(得分:3)
您应该尝试访问它,如果失败,您要么没有必要的权限(可以使用GetAccessControl检查),要么被另一个进程锁定。
但我认为没有任何可靠的措施来区分锁和权限失败(因为您可能能够读取文件,但无法检查权限)。甚至Windows的错误消息表明您要么没有权限,要么被另一个进程使用。
您可以使用WMI CIM_DataFile
类来查询InUseCount
指定的数据文件。
如果您正在寻找与Linux中lsof
实用程序等效的程序设计,要查找给定本地进程的所有打开文件,您可以尝试使用Win32_Process
WMI类通过System.Management
命名空间。您可以发出WMI查询以查找所有本地进程正在使用的所有打开文件中的文件名,也可以查看它是否存在。或者,您可以P / Invoke并直接使用NtQuerySystemInformation
API来完成相同的任务。
答案 1 :(得分:2)
这样做。 MSDN中提到的FileShare.None:
无:拒绝分享当前文件。在文件关闭之前,任何打开文件的请求(通过此过程或其他过程)都将失败。
File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);
编辑:请记住包装Try / Catch块,并使用FileShare.None实际上意味着您要独占打开文件。
答案 2 :(得分:2)
bool CanReadAndWrite(string path)
{
var perm = new System.Security.Permissions.FileIOPermission(
System.Security.Permissions.FileIOPermissionAccess.Write |
System.Security.Permissions.FileIOPermissionAccess.Read,
path);
try
{
perm.Demand();
return true;
}
catch
{
return false;
}
}
检查您是否可以读取和写入文件。
答案 3 :(得分:1)
使用System.IO.File.OpenWrite(path)。将它包含在try / catch块中,如果它已经打开以便在其他地方写入,则会出现System.UnauthorizedAccessException。
答案 4 :(得分:0)
以下语法将有所帮助:
FileStream s2 = new FileStream(name,FileMode.Open,FileAccess.Read,FileShare.Read);
答案 5 :(得分:0)
通常,您应始终避免依赖文件辅助功能检查。原因可能是,它可能会在您访问它之前改变几个周期。
相反,只需尝试打开它,看看是否有任何错误。