繁体   English   中英

在Windows中删除打开的文件(创建匿名文件)?

Delete open file in Windows (creating an anonymous file)?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在Linux下,我的程序将执行以下操作:

  • 进程1打开一个文件(例如,通过将其映射到内存中)。 我们将此文件称为#1
  • 进程2取消链接该文件,并创建一个具有相同名称的新文件。 我们将此文件称为#2。
  • 进程1继续使用文件#1。 当它关闭时,将被删除(因为它没有链接)。 进程1继续处理文件#1中的内容,并且看不到文件#2中的内容。
  • 当两个进程都退出时,文件#2保留在磁盘上。

我想在Windows中实现相同的语义。 阅读了这个问题之后 ,我认为FILE_SHARE_DELETE基本上可以做到这一点。 使用FILE_SHARE_DELETE打开文件是否足够,还是我需要考虑更多事项?

上面的执行流程只是一个示例,我知道还有其他解决Windows中确切问题的方法,但是我想了解如何使此类代码在Windows和Linux之间可移植。

编辑:澄清:用例将为不同的不相关文件重用文件名,但让现有进程保留其数据(例如,考虑配置文件的事务更新),并使文件匿名(未命名),但继续像匿名内存映射一样使用它。 再一次,我知道两种方法都可以通过其他方式在Windows上实现,但是我试图找到一种跨平台移植的方法。

1 个回复

您可以通过结合使用CreateFile,CreateFileMapping和MapViewOfFile调用来实现。 MapViewOfFile将为您提供由磁盘上的文件支持的文件的内存映射缓冲区。

从不同进程执行以下代码时,会将最后关闭进程的进程ID写入文件c:\\ temp \\ temp.txt中

 int main() { TCHAR szMsg[256]; HANDLE hMapFile; LPCTSTR pBuf; HANDLE hFile = CreateFileW( L"C:\\\\Temp\\\\temp.txt", GENERIC_WRITE|GENERIC_READ, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); hMapFile = CreateFileMapping( hFile, // Handle of file opened with rw access NULL, // default security PAGE_READWRITE, // read/write access 0, // maximum object size (high-order DWORD) BUF_SIZE, // maximum object size (low-order DWORD) szName); // name of mapping object if (hMapFile == NULL) { printf( "Could not create file mapping object (%d).\\n", GetLastError()); return 1; } pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); if (pBuf == NULL) { printf("Could not map view of file (%d).\\n", GetLastError()); CloseHandle(hMapFile); return 1; } wsprintfW(szMsg, L"This is process id %d", GetCurrentProcessId()); CopyMemory((PVOID)pBuf, szMsg, (wcslen(szMsg) * sizeof(TCHAR))); MessageBoxW(NULL, szMsg, L"Check", MB_OK); UnmapViewOfFile(pBuf); CloseHandle(hMapFile); CloseHandle(hFile); return 0; } 

确保打开具有GENERIC_READ | GENERIC_WRITE访问权限的文件,并允许FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE访问后续打开的文件。

还要注意在CreateFile中使用CREATE_ALWAYS,这将删除旧文件并在每次调用CreateFile时打开一个新文件。 这就是您所说的“取消链接”效果。

代码是从msdn上的创建命名共享内存中启发而来的。

1 是否可以在Windows中打开匿名文件?

我想打开一个匿名文件,这是在Linux下打开文件取消链接或使用memfd_create ,但这些似乎都没有在Windows下可用(你可以删除一个文件工作,但它的名字在文件关闭之前似乎没有被删除)。 获取文件系统中未显示的文件描述符。 有没有办法在Windows下实现这一目标? 我希望它 ...

2 我们能否在Windows中删除打开的文件?

免责声明:我主要是linux / web开发人员。 Windows具有此“不错”的功能,它拒绝删除任何进程打开的任何文件的权限。 因此,如果防病毒软件在错误的时间击中了错误的文件,则某些随机程序可能行为不当并可能崩溃。 我对吗? 有解决这个问题的计划吗? 你们中的任何人是否 ...

2010-07-08 09:41:29 2 4574   windows
4 限制在CouchDB中的文件删除匿名

我有一个CouchDB,并且任何没有登录的匿名用户都可以删除该文档。 我该如何解决,这样只有特定用户创建的文档才能删除它。 我正在使用CouchApp ...

5 是否可以删除Windows下进程打开的文件?

为了进行测试和模拟,我想删除当前由进程打开的文件。 CreateFile文档指出,可以以一种模式( FILE_SHARE_DELETE )打开文件,该模式允许打开句柄指向的文件被另一个操作删除。 (并且我已经尝试过并通过CreateFile(FILE_SHARE_DELETE)+ Del ...

6 在Windows中创建匿名管道

我刚刚开始学习有关匿名管道通信的知识。 我的问题是AnonymousPipeStream和CreatePipe方法之间有什么区别。 现在,我正在使用CreatePipe()创建管道,并使用ReadFile()/ WriteFile()函数读取/写入数据,并且工作正常。 但是我看到互 ...

8 Android Studio没有在Windows中打开任何文件

我的android studio没有打开任何单个文件,但它在左侧标签中打开了整个项目,并显示了所有文件名。 但是,当我像往常一样单击任何文件名时,它无法工作或打开,并且变得死机了。 我多次重新启动笔记本电脑,并多次同步Project,关闭该项目,然后多次启动该项目。 请帮我... ...

9 在Windows中覆盖打开的文件

Windows在什么情况下允许您覆盖打开的文件? 允许吗? 这包括将另一个文件重命名为与打开的文件相同的名称。 ...

10 在Windows上打开“我的文档”中的文件

我正在编写用于草图的插件。 我找不到从Windows上的My Documents目录追加文本文件的简单方法。 我遇到的问题是: 用当前用户名打开 Windows版本之间的差异。 我需要代码在32位计算机上的Windows 7上的My Documents以附加模式打开 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM