#region 检测文件状态及操作方式选择
[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);
/// <summary>
/// 检测文件是否只读或被使用
/// </summary>
/// <param name="FileNames">要检测的文件</param>
/// <returns>true可用,false在用或只读</returns>
public static bool CheckFilesState(string fileName)
{
if (!File.Exists(fileName))
return true;//文件不存在
if ((File.GetAttributes(fileName) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
return false; //文件只读
IntPtr vHandle = _lopen(fileName, OF_READWRITE | OF_SHARE_DENY_NONE);
if (vHandle == HFILE_ERROR)
return false; //文件被占用
CloseHandle(vHandle); //文件没被占用
return true;
}
/// <summary>
/// 检测文件是否只读或被使用,并由用户选择是否继续操作
/// </summary>
/// <param name="fileFullName">要检测的文件</param>
/// <returns>true已在用,false未用</returns>
public static bool FileHasOpened(string fileFullName)
{
bool lOpened = false;
bool lRetry = true;
do
{
if (!CheckFilesState(fileFullName))
{
if (DialogResult.Cancel == MessageBox.Show("文件只读或已经被打开,请处理后再操作!", "系统错误!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning))
{
lRetry = false;
lOpened = true;
}
}
else
lRetry = false;
} while (lRetry);
return lOpened;
}
#endregion