如何在应用程序运行期间保持文件句柄打开并防止更改

时间:2012-08-25 17:11:05

标签: c# winforms file io

在我的应用程序中,用户创建的对象可以序列化并保存为文件。用户也可以打开它们并继续处理它们(就像项目文件一样!)。我注意到我可以在程序打开文件时删除文件,我的意思是我只是将文件反序列化为对象,因此应用程序不再关心文件了。

但是,当我的应用程序运行并且该文件被加载到程序中时,如何保持该文件繁忙?以下是我的SaveLoad方法:

public static bool SaveProject(Project proj, string pathAndName)
{
    bool success = true;
    proj.FileVersion = CurrentFileVersion;

    try
    {
        using (var stream = new FileStream(pathAndName, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using(var zipper = new ZlibStream(stream, CompressionMode.Compress, CompressionLevel.BestCompression, true))
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(zipper, proj);
            }
        }

    }
    catch (Exception e)
    {
        MessageBox.Show("Can not save project!" + Environment.NewLine + "Reason: " + e.Message, "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        success = false;
    }

    return success;
}

public static Project LoadProject(string path)
{
    try
    {
        using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            using (var zipper = new ZlibStream(stream, CompressionMode.Decompress))
            {
                var formatter = new BinaryFormatter();
                var obj = (Project)formatter.Deserialize(zipper);

                if (obj.FileVersion != CurrentFileVersion)
                {
                    MessageBox.Show("Can not load project!" + Environment.NewLine + "Reason: File version belongs to an older version of the program." +
                        Environment.NewLine + "File version: " + obj.FileVersion +
                        Environment.NewLine + "Current version: " + CurrentFileVersion,
                        "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    //throw new InvalidFileVersionException("File version belongs to an older version of the program.");
                }

                return obj;
            }
        }
    }
    catch (Exception ex)
    {

        MessageBox.Show("Can not load project!" + Environment.NewLine + "Reason: " + ex.Message, "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }

    return null;
}

那我该怎么办?如何为文件制作假句柄?我的意思是如何做到这一点,如果有人试图删除该文件,Windows阻止它'文件正在使用...`消息?

2 个答案:

答案 0 :(得分:1)

  

FileShare.Read :允许随后打开文件进行阅读。   如果未指定此标志,则为打开文件的任何请求   读取(通过此过程或其他过程)将失败,直到文件   已关闭。

您已使用

using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)

将此更改为

using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None)

任何打开或此文件上的任何其他操作的请求都将失败 ,直到关闭/处置FileStream

答案 1 :(得分:1)

不要这样做。如果用户故意删除该文件,那么他就有充分的理由。

如果你通过锁定文件来防止这种情况,那么他就会杀死你的应用并删除文件。所有你所做的就是造成一种不便,那种驱使用户疯狂并给他们运行卸载程序的理由。如果您需要知道在程序运行时文件已被删除,那么您可以使用FileSystemWatcher找到它。