`
leaves
  • 浏览: 8926 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

文件lock的判断(判断文件是否打开)

    博客分类:
  • C#
 
阅读更多
如何判断文件是否打开一直是个很头疼的问题,幸好项目中只是要求文件lock,何为文件lock大致可以理解为文件正在编辑中,禁止其他人写人!

该文件为CSV文件,常规写法为:
TextFieldParser parser = new TextFieldParser(stream,System.Text.Encoding.GetEncoding("Shift_JIS"));
using (parser)
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(","); 
     while (!parser.EndOfData)
    {
        string[] row = parser.ReadFields(); 
          csvDataList.Add(row);
     }
}

如上可读出CSV文件中的数据,并且把同一行每个单元格的数据做成数组。

但是这种写法起不到lock的效果,查询MSDN发现TextFieldParser可以传入个Stream,如果以写文件的方式打开,出现Exception可能就是被lock住了
因此研究了三种解决方法
1,通过独占的方式打开文件
FileStream fileStream = new FileStream(filePathName, FileMode.Open, FileAccess.Read, FileShare.None);
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();
Stream stream = new MemoryStream(bytes);

TextFieldParser parser = new TextFieldParser(stream, System.Text.Encoding.GetEncoding("Shift_JIS"));

FileShare.None会以独占的方式对数据进行读取,这样就起到了lock的效果

2,通过写文件的方式判断
Stream stream = File.OpenWrite(filePathName);
stream.Dispose();    // 必须释放,否则读取文件会出Exception

这样如果文件打开,第一步就会出Exception就可以判断出来了。

3,通过API进行判断
[DllImport("kernel32.dll")]
private static extern IntPtr _lopen(string lpPathName, int iReadWrite);

[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);

private const int OF_READWRITE = 2;
private const int OF_SHARE_DENY_NONE = 0x40;
private static IntPtr HFILE_ERROR = new IntPtr(-1);

public bool IsFileOpenByOtherProcess(string fileName)
{
   File.OpenWrite(fileName);

   IntPtr vHandle = _lopen(fileName, OF_READWRITE | OF_SHARE_DENY_NONE);
   if (vHandle == HFILE_ERROR)
   {
      return true;
   }

    CloseHandle(vHandle);

    return false;
}


但是用一般文本文档编辑工具(text,emEditor)打开并不算是lock,建议用sakura。

以上仅供参考!
2
0
分享到:
评论

相关推荐

    文件的读写及上锁.pdf

    在 lock_set 函数中,我们使用 ftl 函数来设置文件锁,并判断文件是否已经被加锁。如果文件已经被加锁,我们会输出相应的信息。 3. 文件 I/O 模型 在实验中,我们还学习了文件 I/O 模型的概念。文件 I/O 模型指的...

    Delphi锁定文件禁止修改.rar

    此外,代码中还可以添加额外的逻辑来判断操作对象是硬盘还是文件,这可以通过检查`FileName`是否包含路径分隔符(如`\`或`/`)来实现。如果`FileName`中包含路径分隔符,那么它通常代表一个文件;否则,它可能是一个...

    ASPNET文件处理

    - `OpenRead`:以只读方式打开文件。 - `OpenText`:打开文本文件。 - `OpenWrite`:以读写方式打开文件。 - `Create`:创建文件。 - `CreateText`:创建文本文件。 #### 三、FileStream类 `FileStream` 类...

    VBA_读写文件

    - **文件模式**:用于定义文件打开的方式。 - **文件句柄**:即文件编号,是程序与文件交互的标识符。 - **文件访问**:指如何处理文件中的数据。 #### 三、文件模式 VBA支持多种文件模式,主要包括: - **Input**...

    智能判断调整小键盘灯的小工具

    标题中的“智能判断调整小键盘灯的小工具”指的是一个专门设计用于自动管理和控制计算机小键盘(NumLock区域)灯光状态的软件应用。这个小工具具备智能识别功能,能够根据用户所使用的设备类型——台式机或笔记本...

    vb6文件操作

    - `EOF(1)`:判断文件 1 是否到达末尾。 通过以上的介绍,我们可以看出 VB6 在文件操作方面提供了非常全面的支持。无论是文本文件还是二进制文件,都可以通过简单的命令进行高效操作。此外,通过设置不同的访问...

    oracle数据文件被误删除后的灾难处理

    4. **重新打开数据库**:完成所有数据文件的离线删除操作后,重新打开数据库。 - 命令示例:`SQL> alter database open;` 5. **恢复丢失的表空间**:如果整个表空间都被误删除,需要重新创建该表空间,并通过备份...

    delphi控件Tdbf的帮助文件

    - **IsDeleted**:判断记录是否被删除。 - **Undelete**:取消删除记录。 - **CreateTable**:创建新表。 - **CreateTableEx**:创建扩展新表。 - **CopyFrom**:从另一个表复制数据。 - **RestructureTable**:重构...

    TimeLock(Python语言时间锁)

    4. **条件判断与控制流**:在Python中,`if`语句用于检查时间是否已到达,决定是否解锁文件。结合`while`循环,可以持续检查时间,直到达到预设的解锁日期。 5. **权限管理**:为了实现文件锁定,可能需要修改文件...

    监视大小写是否打开

    标题中的“监视大小写是否打开”指的是在计算机操作系统中检测当前键盘的大写锁定(Caps Lock)键的状态。这个功能在多种场景下都很有用,比如在编写代码时确保正确输入、在进行密码输入时避免错误,或者是对用户...

    PHP读取文件内容后清空文件示例代码

    例如,可以通过检查`fopen`、`flock`等函数的返回值来判断操作是否成功,如果操作失败,应适当处理错误情况,例如通过打印错误信息或抛出异常。 总结来说,读取文件内容后清空文件是一个涉及到文件操作、文件锁管理...

    C#开发经验技巧宝典

    0664 判断文件是否存在 411 0665 创建一个文件用于写入UTF-8编码的文本 411 0666 OpenRead方法打开现有文件并读取 412 0667 打开现有UTF-8编码文本文件并进行读取 412 0668 OpenWrite方法打开现有文件并...

    API之网络函数---整理网络函数及功能

    GetBinaryType 判断文件是否可以执行 GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数 GetCurrentDirectory 在一个缓冲区中装载当前目录 GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,...

    操作系统进程同步互斥实验.pdf

    其中,进入区中判断资源是否可用,如果可用,则资源数量减 1,进程进入临界区;否则进程阻塞等待。退出区中资源数量加 1,唤醒阻塞等待该资源的进程。进入区和退出区都是原子操作。操作系统中,通常用信号量来实现...

    c#视频拆解合并器原理及代码

    FileStream有多种构造函数,可以根据需要选择不同的文件打开模式(如:FileMode.Create、FileMode.Append等)。其重要属性包括CanRead、CanSeek、CanWrite等,用于判断流是否支持读、写、定位操作;Length属性返回...

    mysql数据库my.cnf配置文件

    不论事务是否已经提交)默认的日志文件是ib_logfile0,ib_logfile1 # 1:当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。 # 2:如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每...

    C#程序提示“正由另一进程使用,因此该进程无法访问该文件”的解决办法

    这个错误通常发生在尝试访问一个已经被其他进程打开或锁定的文件时。例如,当你试图删除、移动或修改一个正在被程序使用的文件时,系统会抛出这种异常。以下我们将深入探讨这个问题,并提供解决方案。 ### 错误原因...

    Win32FILE-operator.docx

    4. **文件打开模式**:`"r"`表示只读,`"w"`表示只写,`"a"`表示追加,`"b"`表示二进制模式。`"r+"`、`"w+"`和`"a+"`则分别表示读写、写读和追加读写。在Windows API中,`open`函数用于打开文件,`flags`参数可以...

    abap破解访问关键字

    在这个步骤中,我们需要使用 Tcode SE30 回车,输入 Update PROGDIR set edtx = '' Where name = 'LSKEYF00' And state = 'A',然后执行 F8,以打开文件 LSKEYF00 的 Editor lock,相当于取消 Windows 下面的只读...

    VB禁止重复运行的代码

    在这个例子中,如果"lockfile.txt"已经存在(由另一个运行的程序实例创建),那么尝试打开文件时会出错,从而阻止程序再次启动。 在VB中,`.vbp`文件是工程文件,存储了项目的基本信息和引用;`.frm`文件是窗体文件...

Global site tag (gtag.js) - Google Analytics