クライアント pc にインストールされている関連プログラムで、ドキュメント/ファイル (.doc、.pdf、.xlsx、.tiff など) をユーザーに開く必要がある Windows フォーム アプリケーション i C# を作成しています。
ユーザーが表示しているプログラムを閉じるとすぐに、ファイルを削除する必要があります。
ファイルを作成して開くためのオプションをいくつか試しましたが、まだ金の卵が見つかりません。
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);
}
上記の方法で、最後の行 ( ) で「別のプロセスによって使用されているため、プロセスはファイル 'xxx' にアクセスできません」という IOException を取得しています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);
}
また、このメソッドでは、「別のプロセスで使用されているため、プロセスはファイル 'xxx' にアクセスできません」という IOException も取得しています(最後の行 ( 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);
}
}