C# winform中判断文件是否处于打开状态

最近做一个课题,要求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文件框。

个人原创,转载请注明出处!!!

时间: 2024-10-05 09:34:51

C# winform中判断文件是否处于打开状态的相关文章

如何设置eclipse中的文件的默认打开方式

如何设置eclipse中的文件的默认打开方式 打开eclipse.选择如下:windows --> preferences --> General --> Editors --> file Associations 如果列表中没有,可以点击ADD添加文件的格式. 然后在下面添加默认打开的此格式文件的应用即可,如下图:

shell中判断文件或目录是否存在

可以通过man test来查看文档,下面的文章转自http://m.blog.csdn.net/blog/yuanjungogogo/9222875 #!/bin/sh myPath="/var/log/httpd/" myFile="/var /log/httpd/access.log" # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 if [ ! -x "$myPath"]; then mkdir "$myPa

(二) C/C++中判断文件或文件夹是否存在

方法1. access函数 适用范围:所有C/C++项目 头文件:   #include < io.h> 函数原型: intaccess(const char *filename, int mode); 函数说明:判断是否具有存取文件的权限 函数参数说明: filename:可以填写文件夹路径或者文件路径 mode: F_OK (或0): 判断该文件/文件夹是否存在: R_OK (或2): 判断该文件/文件夹是否有读权限: W_OK (或4): 判断该文件/文件夹是否有写入权限: X_OK (

C#中判断文件夹中存在某个txt文本

strFileName="D:\\strarray.txt"; if (File.Exists(strFileName))//判断文件是否存在 { }

Shell中判断文件,目录是否存在

一. 具体每个选项对应的判断内容: -e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真 -L filename 如果 filename为符号链接,则为真 -r filename 如果 filename可读,则为真 -w filename 如果 filename可写,则为真 -x filename 如果 filename可执行,则为真 -s filename 如果

动态规划之DP中判断是否到达某一状态(最短时间是什么)?

codevs1684 垃圾陷阱 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D (2 <= D <= 100)英尺. 卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了.另外,卡门可以通过吃一些垃圾来维持自己的生命. 每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间. 假设卡门预先知道

winform中的状态栏,以及在状态栏目上显示时间

1:在winform上添加状态栏,并且在状态栏目上多添加几个label. step1:拖一个StatusStrip到winform上,名字默认为statusStrip1.找到statusStrip1的items属性,双击打开添加3个StatusLabel.名字默认分别为toolStripStatusLabel1.toolStripStatusLabel2.toolStripStatusLabel3.他们分别是从左到右显示.设置toolStripStatusLabel2的属性的BorderSide

在Eclipse中设置文件的默认打开方式

在Eclipse中,我们可以设置jsp.xml.js.sql等文件默认打开方式: ①.打开配置选项 ②.找到文件设置 ③.选中我们要设置的文件,默认即可:

解决Arcgis10.2.2中dbf文件用EXCEL打开乱码问题

1.开始 -- 运行,输入”Regedit“,打开 注册表 . 2.如是用的是 10.x 版本 ArcGIS Desktop,定位到 ‘计算机\HKEY_CURRENT_USER\Software\ESRI\Desktop 10.x' 如果是9.3.1之前的版本,定位到 'My Computer\HKEY_CURRENT_USER\Software\ESRI'.3.创建项 'Common', 接着在其下创建 'CodePage' 项, 添加 '字符串’,名称: dbfDefault,健值:oem