【发布时间】:2013-03-08 22:27:47
【问题描述】:
我正在用 C# 编写一个 Windows 窗体应用程序,我需要在安装在客户端电脑。
用户关闭显示程序后,文件应立即删除。
我尝试了几种创建和打开文件的方法,但还没有找到金蛋。
public static void databaseFileRead(string file_name, byte[] file)
{
path = file_name;
int file_size_int = file.Length;
FileStream create = new FileStream(@path, FileMode.Create, FileAccess.ReadWrite, FileShare.Read, file_size_int, FileOptions.DeleteOnClose);
create.Write(file, 0, file_size_int);
FileStream open = File.Open(@path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
}
在上面的方法中,我得到一个 IOException,在最后一行 (FileStream open = ...) 指出“该进程无法访问文件 'xxx',因为它正被另一个进程使用”。
public static void databaseFileRead(string file_name, byte[] file)
{
path = file_name;
int file_size_int = file.Length;
FileStream create = File.OpenWrite(@path);
var attributes = File.GetAttributes(@path);
File.SetAttributes(@path, attributes | FileAttributes.ReadOnly|FileAttributes.Temporary);
create.Close();
Process p = Process.Start(@path);
p.WaitForExit();
File.Delete(@path);
}
在这种方法中,我还收到一个 IOException,指出“进程无法访问文件 'xxx',因为它正在被另一个进程使用”在最后一行 (File.Delete(@path);)意味着该文件仍在使用中,这是正确的。 p.WaitForExit(); 似乎没有等待所有程序,例如OpenOffice...
是否可以在外部程序中打开/显示使用FileOptions.DeleteOnClose 创建的文件?
如果有,怎么做?
我确实喜欢这个想法,Windows 会在文件不再使用时立即删除该文件。
文件自动从用户硬盘中消失是很重要的,最好的选择是从流或同等文件中读取和打开文件。但据我所知,这是不可能的......
已解决:
但是我不确定这是否是一种探测方法来捕获异常并再次调用closeIfReady 方法直到文件被释放...
public static void databaseFileRead(string file_name, byte[] file)
{
var path = file_name;
int file_size_int = file.Length;
if (File.Exists(path))
{
File.Delete(path);
}
FileStream create = File.OpenWrite(path);
create.Write(file, 0, file_size_int);
var attributes = File.GetAttributes(path);
File.SetAttributes(path, attributes | FileAttributes.Temporary);
create.Close();
Process p = Process.Start(path);
while (!p.HasExited)
{
Thread.Sleep(500);
}
closeIfReady(path);
}
static void closeIfReady(string path)
{
try
{ File.Delete(@path); }
catch
{
Thread.Sleep(1000);
closeIfReady(path);
}
}
【问题讨论】:
标签: c# database blob filestream