利用C#编写软件时,如果用户新创建一个文件,然后对该文件读写不会有任何问题。如果用户想对已有的文件进行覆盖操作,如果该文件被其他第三方软件打开,将不能对该文件进行读写。本文设计以下文件创建方法,可以解决以上问题。
本文的设计思路如下所示:
程序如下:
bool fileExistFlag = false;//文件是否存在标志位
fullPath = "";
System.Windows.Forms.SaveFileDialog dialog = new System.Windows.Forms.SaveFileDialog();
dialog.Filter = "Files(*.csv)|*.csv|Files(*.xls)|*.xls";
dialog.OverwritePrompt = false;//关闭系统默认检查
//用户选择或输入文件名
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if (System.IO.File.Exists(dialog.FileName))//检测文件是否存在
{
fileExistFlag = true;//标识文件存在,接下来要进行覆盖操作
}
else
{
fileExistFlag = false;//标识文件不存在,接下来要进行写新的文件
}
fullPath = dialog.FileName;//获取文件路径和文件名
}
if (fullPath != "")
{
FileInfo fi = new FileInfo(fullPath);//创建名xls文件
fi.Directory.Create();
}
else
{
//当文件存在过,要判断文件是否被其他程序占用,否则直接读写文件
if (fileExistFlag)
{
if (FileIsUsed(fi.ToString()))
{
System.Windows.MessageBox.Show("要读写的文件被占用!");
}
else
{
System.Windows.MessageBox.Show("文件创建成功!");
///读写新创建的文件
}
}
else
{
System.Windows.MessageBox.Show("文件创建成功!");
///读写新创建的文件
}
}
以上一段代码用到FileIsUsed()方法,该方法通过读用户新创建的文件夹判断文件是否被其他程序所占用
/// <summary>
/// 函数功能:判断打开的文件是否被其他程序占用,返回指示文件是否已被其它程序使用的布尔值
/// </summary>
/// <param name="fileFullName"></param>
/// <returns><returns>如果文件已被其它程序使用,则为 true;否则为 false</returns>
private bool FileIsUsed(string fileFullName)
{
bool result = false;
if (!System.IO.File.Exists(fileFullName))//判断文件是否存在,如果不存在,直接返回 false
{
result = false;
}
// else//如果文件存在,则继续判断文件是否已被其它程序使用
{
//逻辑:尝试执行打开文件的操作,如果文件已经被其它程序使用,则打开失败,抛出异常,根据此类异常可以判断文件是否已被其它程序使用。
System.IO.FileStream fileStream = null;
try
{
fileStream = System.IO.File.Open(fileFullName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);
result = false;
}
catch (System.IO.IOException ioEx)
{
result = true;
}
catch (System.Exception ex)
{
result = true;
}
finally
{
if (fileStream != null)
{
fileStream.Close();
}
}
}
return result;
}