最近做一个课题,要求winform客户端能保存接收到的实验数据到文件(如.txt文件),并能打开保存好了的实验数据文档,当数据文件已经被打开,要提示文件已被打开,也就是如何判断文件是否处于打开状态,然后给出相应提示。通过查找资料发现C#本身是很难判断一个文件是否被打开的,相关资料给出需用到windowsAPI来实现,这种方法按理说是可以的,但也许是我没有完全领会到相关函数的意义和返回值,致使不能判断文件已经被打开,相关的程序和问题给出如下:
public class FileStaues
{
[DllImport("kernel32.dll")]
private static extern IntPtr _lopen(string lpPathName, int iReadWrite);//IntPtr相当于long类型
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
private const int OF_WRITE = 2;
private const int OF_SHARE_DENY_NONE = 0x40;
private static readonly IntPtr HFILE_ERROR = new IntPtr(964);
public static int FileIsOpen(string fileFullName)
{
if (!File.Exists(fileFullName))
{//不存在文件
return -1;
}
//handle的值始终不是-1,这样就无法返回1,也就不能判定文件已经打开,就是这个地方有问题
IntPtr handle = _lopen(fileFullName, OF_WRITE | OF_SHARE_DENY_NONE);
if (handle == HFILE_ERROR)
{//文件已经打开
return 1;
}
CloseHandle(handle);
return 0;
}
}
相关的调用:
private int SaveOpenResult;
SaveOpenResult = FileStaues.FileIsOpen(ReceiveFileName);
if (SaveOpenResult == 0)
System.Diagnostics.Process.Start(ReceiveFileName);
else if (SaveOpenResult == -1)
throw new Exception("文件不存在...");
else if(SaveOpenResult == -1)
throw new Exception("文件已打开..."); //当按了“打开”按钮后出现.txt保存文件,但当在次按了“打开”按钮后还是会出现.txt保存文件,不提示已经被打开
希望有人能指出这种方法的错误之处,谢谢了!!!
为了能提示保存文件已经被打开,需寻找另外的方法。。。
通过查找C#打开文件的相关资料,C#打开文件可使用
System.Diagnostics.Process.Start(文件路径\文件名);
语句来打开,这是使用进程来打开文件,相当于打开一个文件就是开了一个进程,那么能否通过判断相关的进程是否退出来判定文件是否处于打开状态呢?经过试验,是可以的,程序如下:
<span style="font-family: Arial, Helvetica, sans-serif;">System.Diagnostics.Process OpenSaveFileProc;//指定进程</span><pre name="code" class="csharp">private void OpenSaveButton01_Click(object sender, EventArgs e)//打开保存文件
{
try
{
if (!File.Exists(文件路径\文件名))
throw new Exception("文件不存在...");
if (OpenSaveFileProc == null || OpenSaveFileProc.HasExited == true)
OpenSaveFileProc = System.Diagnostics.Process.Start(文件路径\文件名);
else throw new Exception("文件已打开...");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message, "出错提示");
}
}
结果如图:

第一次按了“打开”按钮,打开文件
再次按了“打开”按钮后,判断RCF.txt文件已经被打开,并给出出错提示,而不会再次出现RCF.txt文件框。
个人原创,转载请注明出处!!!