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

标签 windows vb.net file filesystems

不确定这是否可行,但我正在创建一个文件编码应用程序。当一个文件被解码时,它被临时保存在一个临时目录中,之后可以定期打开它。但是,我实际上需要确定文件在打开它的应用程序关闭它(例如关闭)后立即被删除。否则,解码的( 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/

相关文章:

linux - Git 状态忽略行尾/相同文件/windows & linux 环境/dropbox/meld

.NET 4.0 应用程序在没有 Visual Studio 的机器上抛出异常

c# - .NET IL .maxstack 指令如何工作?

c - 从文件中读取可变长度数组

c - LoadLibrary() 一个 EXE?

windows - 是否有人在使用他们会推荐给其他人的第三方 Windows 注册表编辑器?

file - 如果不执行fclose()退出程序会怎样?

C - 从文件中选择随机字符串

c++ - Windows VK_ 常量是如何声明的?

vb.net - JSON.Net - 反序列化对象格式