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

C# 如何在应用程序运行期间保持文件句柄打开并防止更改,c#,winforms,file,io,C#,Winforms,File,Io,在我的应用程序中,用户创建的对象可以序列化并保存为文件。用户还可以打开它们并继续处理它们(就像项目文件一样!)。我注意到,当程序打开文件时,我可以删除它们,这意味着我只是将文件反序列化为对象,这样应用程序就不再关心这些文件了 但是,当我的应用程序正在运行并且该文件已加载到程序中时,如何使该文件保持忙碌?以下是我的保存和加载方法: public static bool SaveProject(Project proj, string pathAndName) { bool success

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

但是,当我的应用程序正在运行并且该文件已加载到程序中时,如何使该文件保持忙碌?以下是我的
保存
加载
方法:

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会通过“正在使用该文件…”消息来阻止它

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

你用过

using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)
将此更改为

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

任何打开该文件的请求或对该文件的任何其他操作都将失败,直到文件流被关闭/释放。

不要这样做。如果用户有意删除该文件,那么他将有一个很好的理由


如果你通过锁定文件来阻止这一点,那么他只会杀死你的应用程序并删除文件。您所完成的只是制造了一种不便,这种不便会让用户发疯,并给他们运行卸载程序的理由。如果您需要知道该文件在程序运行时被删除,那么您可以使用FileSystemWatcher查找。

打开您的文件,在应用生命周期内不要关闭它。您的意思是不应该关闭
文件流
?那么代码会是什么样子呢?声明
stream
为静态,并使用
saaah删除这两个
,你说得对!我不知道
FileSystemWatcher
在我的情况下,它看起来是正确的选择。