不确定这是否可行,但我正在创建一个文件编码应用程序。当一个文件被解码时,它被临时保存在一个临时目录中,之后可以定期打开它。但是,我实际上需要确定文件在打开它的应用程序关闭它(例如关闭)后立即被删除。否则,解码的( secret )文件只是在没有监督的情况下卡在临时目录中。
此外,即使我的应用程序本身因任何原因关闭,如果可能,我也想将此任务传递给 Windows。所以假设用户解码一个文件并打开它然后我的应用程序关闭(正常或异常),temp 目录中的解码文件仍然应该在不再使用时立即删除。
我该怎么做?我已经看到像 FileSystemWatcher
这样的提示和一个琐碎的“每秒检查一次”的想法,但是如果我的应用程序在解码文件关闭时不存在,我仍然希望删除该文件.所以我想我需要将此责任传递给 Windows,但我不确定这是否可行,如果可行,如何实现。
那么,如果我的应用程序在那个特定时刻没有运行,我该如何在文件关闭后立即删除它呢?
最佳答案
这样做可能有效:
- 在创建文件的过程中,使用 FileOptions.DeleteOnClose 和 FileShare.ReadWrite(如果其他进程只需要读取访问权限,则使用 FileShare.Read)创建文件。您可能还需要 FileShare.Delete。
- 在创建它的主应用程序退出之前,不要让该文件关闭。
- 在使用临时文件的其他进程中,使用与原始文件相同的文件选项打开它。
这样,当最后一个打开文件的进程关闭时,文件将被删除。
更新:
如评论中所述,.NET API 中似乎没有办法同时指定 FIleShare 选项和 FileOptions.DeleteOnClose。可以直接使用 Win32。我复制了一个我在下面测试过的样本。有 2 个程序,一个创建文件,另一个使用它。两者之间唯一显着的区别是消费者使用 OPEN_EXISTING 打开文件。
创作者
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE fh = CreateFile(
L"yourFilePath\\tempFile.dat",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
CREATE_NEW,
FILE_FLAG_DELETE_ON_CLOSE,
NULL);
if(fh==INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to create file. Error code = " << GetLastError() << std::endl;
return 1;
}
std::cout<< "Hit enter to close.";
std::string inp;
std::getline(std::cin,inp);
CloseHandle(fh);
return 0;
}
消费者
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE fh = CreateFile(
L"yourFilePath\\tempFile.dat",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_DELETE_ON_CLOSE,
NULL);
if(fh==INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to create file. Error code = " << GetLastError() << std::endl;
return 1;
}
DWORD written;
if(!WriteFile(fh,"Test",4,&written,NULL))
{
std::cerr << "Failed to write data to file. Error code = " << GetLastError() << std::endl;
return 1;
}
std::cout<< "Hit enter to close.";
std::string inp;
std::getline(std::cin,inp);
CloseHandle(fh);
return 0;
}
关于windows - 如果应用程序未运行,如何删除文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5571090/