gpt4 book ai didi

windows - 如果应用程序未运行,如何删除文件?

转载 作者:可可西里 更新时间:2023-11-01 11:38:28 26 4
gpt4 key购买 nike

不确定这是否可行,但我正在创建一个文件编码应用程序。当一个文件被解码时,它被临时保存在一个临时目录中,之后可以定期打开它。但是,我实际上需要确定文件在打开它的应用程序关闭它(例如关闭)后立即被删除。否则,解码的( secret )文件只是在没有监督的情况下卡在临时目录中。

此外,即使我的应用程序本身因任何原因关闭,如果可能,我也想将此任务传递给 Windows。所以假设用户解码一个文件并打开它然后我的应用程序关闭(正常或异常),temp 目录中的解码文件仍然应该在不再使用时立即删除。

我该怎么做?我已经看到像 FileSystemWatcher 这样的提示和一个琐碎的“每秒检查一次”的想法,但是如果我的应用程序在解码文件关闭时不存在,我仍然希望删除该文件.所以我想我需要将此责任传递给 Windows,但我不确定这是否可行,如果可行,如何实现。

那么,如果我的应用程序在那个特定时刻没有运行,我该如何在文件关闭后立即删除它呢?

最佳答案

这样做可能有效:

  1. 在创建文件的过程中,使用 FileOptions.DeleteOnClose 和 FileShare.ReadWrite(如果其他进程只需要读取访问权限,则使用 FileShare.Read)创建文件。您可能还需要 FileShare.Delete。
  2. 在创建它的主应用程序退出之前,不要让该文件关闭。
  3. 在使用临时文件的其他进程中,使用与原始文件相同的文件选项打开它。

这样,当最后一个打开文件的进程关闭时,文件将被删除。

更新:

如评论中所述,.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com