在我的应用程序中,用户创建的对象可以序列化并保存为文件。用户也可以打开它们并继续处理它们(就像项目文件一样!)。我注意到我可以在程序打开文件时删除文件,我的意思是我只是将文件反序列化为对象,因此应用程序不再关心文件了。
但是,当我的应用程序运行并且该文件被加载到程序中时,如何保持该文件繁忙?以下是我的Save
和Load
方法:
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阻止它'文件正在使用...`消息?
答案 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找到它。