我已经看到了几个关于使用Handle或Process Monitor的答案,但我希望能够在我自己的代码(C#)中找到哪个进程正在锁定文件.
我有一种令人讨厌的感觉,我将不得不在win32 API中徘徊,但如果有人已经这样做并且可以让我走上正轨,我真的很感激帮助.
我正在C#中实现一个应该监视目录的类,在删除文件时处理这些文件,然后在处理完成后立即删除(或移动)处理过的文件.由于可以有多个线程运行此代码,第一个运行此代码的线程将其锁定,因此没有其他线程将读取相同的文件,并且没有外部进程或用户可以以任何方式访问.我想保持锁定直到文件被删除/移动,因此没有其他线程/进程/用户访问它的风险.
到目前为止,我尝试了2个实现选项,但它们都没有按我的意愿工作.
选项1
FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.Delete);
//Read and process
File.Delete(file.FullName); //Or File.Move, based on a flag
fs.Close();
Run Code Online (Sandbox Code Playgroud)
选项2
FileStream fs = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
//Read and process
fs.Close();
File.Delete(file.FullName); //Or File.Move, based on a flag
Run Code Online (Sandbox Code Playgroud)
选项1的问题是其他进程可以访问该文件(它们可以删除,移动,重命名),同时应该完全锁定.
选项2的问题是文件在被删除之前被解锁,因此其他进程/线程可以在删除发生之前锁定文件,因此删除将失败.
我正在寻找一些可以使用我已经拥有独占访问权限的文件句柄执行删除的API.
编辑
被监视的目录驻留在pub共享中,因此其他用户和进程可以访问它. 问题不是在我自己的进程中管理锁.我试图解决的问题是如何独占锁定文件然后移动/删除它而不释放锁
假设我有一个文件夹结构,如:
C:\MyTemp - MySubFolder
如果我尝试删除此使用:
Dim path As String = "C:\MyTemp"
Dim di As System.IO.DirectoryInfo
di = System.IO.Directory.CreateDirectory(path)
di.CreateSubdirectory("MySubFolder")
di.Delete(True)
Run Code Online (Sandbox Code Playgroud)
这工作正常,除非我打开Windows资源管理器,我正在查看'MySubFolder'目录.然后我得到一个IOException 该目录不为空. - 单击确定将取消此操作,然后不删除文件夹结构.
有关如何正确执行此操作(即删除)的任何想法,即使在Windows资源管理器中打开文件夹结构时运行此代码也是如此?
我有一种情况,人们连接到共享上的文件,它阻止我覆盖文件.我正在尝试编写一个方法来查看我提供的filePath当前是否以这种方式锁定并关闭此资源的网络会话.
我查看了ADSI Winnt提供程序,但是没有实现Resources.Remove成员.然后我查看了Win32_ServerSession,虽然我能够使用Delete成员,但它会杀死给定用户的所有资源.我需要弄清楚如何更具体.
我一直在走GetRelationsShips和Properties,但我现在很难过.
我正在开发一个应用程序,它需要删除文件,无论其他进程是否正在使用它
请考虑以下代码段.
using System;
using System.IO;
namespace DotNet_Concepts.File_Operation
{
class Deleting_File_Which_Is_In_Use
{
static void Main(string[] args)
{
StreamReader lclFileStream = null;
string lclFileName=string.Empty;
try
{
lclFileName=@"E:\Visual Studio 2008 Projects\DotNet Concepts\DotNet Concepts\Local Files\Garbage.txt";
if (File.Exists(lclFileName))
{
lclFileStream = new StreamReader(lclFileName);
if (lclFileStream != null)
{
//Doing some operation
}
//Deleting the file before closing the stream
File.Delete(lclFileName);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
}
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在删除同一进程使用的文件.是否可以删除该文件
谢谢,阿米特沙阿