对于应用程序,有时候可能需要判断某个文件是否已经被打开,也就是指是否被某个流连接着。这在对文件的读写比较频繁的程序中尤为重要,因为一个文件同一时刻只能有一个流连接的。下面的代码也许能有所帮助。
- public class FileStatus
- {
- [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 readonly IntPtr HFILE_ERROR = new IntPtr(-1);
- public static int FileIsOpen(string fileFullName)
- {
- if (!File.Exists(fileFullName))
- {
- return -1;
- }
- IntPtr handle = _lopen(fileFullName, OF_READWRITE | OF_SHARE_DENY_NONE);
- if (handle == HFILE_ERROR)
- {
- return 1;
- }
- CloseHandle(handle);
- return 0;
- }
- }
测试:
- class Program
- {
- static void Main(string[] args)
- {
- string testFilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"testOpen.txt";
- FileStream fs = new FileStream(testFilePath, FileMode.OpenOrCreate, FileAccess.Read);
- BinaryReader br = new BinaryReader(fs);
- br.Read();
- Console.WriteLine("文件被打开");
- int result =FileStatus.FileIsOpen(testFilePath);
- Console.WriteLine(result);
- br.Close();
-
结果:
代码下载:http://download.youkuaiyun.com/detail/yysyangyangyangshan/4914142