我正在用 C# 编写一个 Windows 窗体应用程序,我需要在客户端 PC 上安装的相关程序中向用户打开一个文档/文件(.doc、.pdf、.xlsx、.tiff 等)。
该文件应在用户关闭显示程序后立即删除。
我尝试了几种创建和打开文件的选项,但还没有找到金蛋。
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,在最后一行 ( )上显示“进程无法访问文件 'xxx',因为它正被另一个进程使用”。FileStream open = ...
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);
}
}