判断文件是否被打开
方法一:通过try catch对文件的移动操作,如果文件打开,将不能移动,会进入catch段代码,通过返回bool值来反应是否能正常移动
private void button2_Click(object sender, EventArgs e)
{
string filePath = "Test.docx";
bool bl = isOpen(filePath);
}
private static bool isOpen(string filePath)
{
try
{
//第一个 移动文件
File.Move(filePath, filePath);
//第二个 读写
Stream stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
return true;
}
catch(Exception e)
{
return false;
}
}
方法二:_lopen(FileN,OF_READWRITE|OF_SHARE_DENY_NONE)检测返回值
[DllImport("kernel32.dll")]
public static extern IntPtr _lopen(string filePath,int iReadWrite);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
public const int OF_READWRITE = 2;
public const int OF_SHARE_DENY_NONE = 0x40;
public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
private void button3_Click(object sender, EventArgs e)
{
string filePath = "Test.docx";
IntPtr vHandle = _lopen(filePath,OF_READWRITE|OF_SHARE_DENY_NONE);
if (vHandle == HFILE_ERROR)
{
MessageBox.Show("被占用!");
return;
}
CloseHandle(vHandle);
MessageBox.Show("未被占用!");
}
其中,对应txt文件,当txt文件被记事本打开后,程序不会锁定,对于除txt文件的其他文件,上面的方法都可以正常实现。
我们可以通过对process进程的循环遍历来判断文件是否被notepad打开。
private void button5_Click(object sender, EventArgs e)
{
string fileName="Test.txt";
Process[] processes = Process.GetProcessesByName("notepad");
foreach (Process process in processes)
{
if (process.MainWindowTitle.Equals(fileName+" - Notepad"))
{
MessageBox.Show("被占用");
return;
}
}
}