为什么我看到“文件在另一个进程中打开了”?程序出错

本文关键字:程序出错 进程 我看 文件 另一个 为什么 | 更新日期: 2023-09-27 18:03:11

只有在我创建文件之后才会弹出错误,然后尝试从新文件中读取。我知道它为什么出错(文件必须仍然打开);但我失去了如何解决这个问题,因为FileInfo没有一个关闭的方法,不应该在文件上有一个流。显然,一定有更好的编码方式。如有任何帮助,不胜感激。

Code解释:构造函数构建我需要的数据,检查并创建(如果需要的话)目录和文件。构造函数完成后,我对数组中的每个FileInfo调用CheckHasData;这是错误发生的时间。

public FileHandler()
    {
        files = new FileInfo[fileNames.Count()];
        if (!Directory.Exists(stdDataPath))
        {
            Directory.CreateDirectory(stdDataPath);
        }
        filePaths = new string[fileNames.Length];
        for (int i = 0; i < fileNames.Length; i++)
        {
            this.filePaths[i] = stdDataPath + this.fileNames[i];
            this.files[i] = new FileInfo(filePaths[i]);
        }
        //check for data in each file
        checkAndMakeFiles();
    }
 private void checkAndMakeFiles()
    {
        foreach (FileInfo fI in this.files)
        {
            try
            {
                if (!fI.Exists)
                {
                    fI.Create();
                }
                fI.Refresh();
            }
            catch (FileNotFoundException e)
            {
                System.Windows.Forms.MessageBox.Show("File not found: " + e.FileName, "error", System.Windows.Forms.MessageBoxButtons.OK);
            }
            catch (FileLoadException e)
            {
                System.Windows.Forms.MessageBox.Show("File failed to load : " + e.FileName + "'nReason: " + e.Message, "error", System.Windows.Forms.MessageBoxButtons.OK);
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show("error: " + e.GetType() + "'nReason" + e.Message + "'n" + e.StackTrace, "error", System.Windows.Forms.MessageBoxButtons.OK);
            }
        }
    }

private bool checkHasData(FileInfo fi)
    {
        FileStream fs = fi.OpenRead();
        bool data = fs.Length > 0 ? true : false;
        fs.Close();
        return data;
    }

为什么我看到“文件在另一个进程中打开了”?程序出错

因为FileInfo。Create打开一个流,但不能关闭它

 using(fI.Create())
     ;

将调用包含在using语句中,如果也是空的,将确保由调用创建的流被关闭和处置

FileInfo上的Create()方法返回FileStream,使用后应关闭。

试试这个:

private void checkAndMakeFiles()
    {
        foreach (FileInfo fI in this.files)
        {
                if (!fI.Exists)
                {
                    fI.Create();
                    fI.Close();
                }
          }
    }
作为一个边注,无论何时你处理流最好使用使用,这样你就不需要管理资源。例如:

using (FileStream fs = fi.Create()) 
{
....
}