- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一个 shell 脚本,它将在 Linux 上运行,但可以对位于挂载分区上的文件进行操作,
可能有也可能没有 ext* 文件系统。例如,它可以是 NTFS、FAT32 或任何基于 inode 或非 inode 的系统;
可以进一步将其重新安装到运行非 Linux 操作系统(如 Windows 或 Mac)的其他机器上。
此外,我的脚本需要能够通过在 Linux、Windows 或 Mac 机器上运行的远程进程删除这个共享的、任意格式化的分区上的文件(即使正在读取或写入文件)
问题:
能够删除正在使用的文件的功能,
一个。只有文件系统?
或者,只有操作系统?
或者,两者的结合?
(Q1 的扩展)对文件执行 I/O 的进程和删除文件的进程是本地进程还是远程进程有关系吗?
最佳答案
Does it matter if the processes doing I/O on the file and the one deleting the file are both local or remote?
有趣 - 远程系统如何直接访问windows上的文件(打开、读写数据、删除)?真的这不可能。我们需要一些在本地系统中运行的代理(LANMan 服务器),它将通过远程命令(例如 Network Redirector 发送)对文件进行本地 操作。所以从文件系统的角度来看——所有操作总是本地。
Is the ability to be able to delete a file in use a feature of
这当然是由文件系统驱动程序实现的,但是这个驱动程序是为具体的操作系统编写的,并基于它规则。虽然磁盘上的文件系统数据具有通用格式(结果驱动器在一个操作系统中格式化(和写入文件),可以从另一个操作系统读取) - 文件系统驱动程序如何处理请求,打开,读取,写入,删除文件 - 这是特定于操作系统。不同的操作系统不同。基于它的规则。所以磁盘上的数据格式是通用的,只依赖于文件系统。但是这些数据如何读/写/删除 - 已经特定于操作系统。
在 Windows 中我们有 next rules用于删除文件:
Normally a file marked for deletion is not actually deleted until all open handles for the file have been closed and the link count for the file is zero. When marking a file for deletion using FILE_DISPOSITION_POSIX_SEMANTICS, the link gets removed from the visible namespace as soon as the POSIX delete handle has been closed, but the file’s data streams remain accessible by other existing handles until the last handle has been closed.
所以一般文件不会被删除,直到它的最后一个句柄被关闭。在我们尝试删除文件后,文件变得不可访问 - 无法再打开它(我们得到错误已请求对具有删除挂起的文件对象进行非关闭操作。如果尝试这样做,在文件标记后删除)。但是如果文件已经打开——我们仍然可以通过这个句柄来处理它。如果部分存在于文件中,也无法删除文件 - 将出现错误已尝试删除无法删除的文件或目录。
begin from win10 redstone1 build exist FILE_DISPOSITION_POSIX_SEMANTICS
标志,当删除句柄关闭时,该标志允许从可见命名空间中删除文件名,但文件的数据流仍可由其他现有句柄访问,直到最后一个句柄已关闭已关闭
windows 代码测试演示:(FILE_DISPOSITION_POSIX_SEMANTICS
ntfs 支持仅从 _WIN32_WINNT_WIN10_RS1
开始。FileDispositionInfoEx
信息类也支持从 _WIN32_WINNT_WIN10_RS1
only. in previous build we simply got not implemented error)
void print_error(PCSTR name)
{
PWSTR sz;
NTSTATUS status = RtlGetLastNtStatus();
if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_HMODULE,
GetModuleHandle(L"ntdll"), status, 0, (PWSTR)&sz, 0, 0))
{
DbgPrint("%s=%x\n%S\n", name, status, sz);
LocalFree(sz);
}
}
HANDLE OpenFile(PCWSTR lpFileName, DWORD dwDesiredAccess)
{
HANDLE hFile = CreateFileW(lpFileName, dwDesiredAccess, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
print_error("OpenFile");
return 0;
}
return hFile;
}
void ReadTest(HANDLE hFile)
{
if (hFile)
{
ULONG dwBytes;
if (ReadFile(hFile, &dwBytes, sizeof(dwBytes), &dwBytes, 0))
{
DbgPrint("ReadFile=OK\n");
}
else
{
print_error("ReadFile");
}
}
}
void DeleteTest(PCWSTR lpFileName)
{
HANDLE hFile1, hFile2, hFile3;
if (hFile1 = OpenFile(lpFileName, DELETE))
{
hFile2 = OpenFile(lpFileName, FILE_GENERIC_READ);
FILE_DISPOSITION_INFO_EX fdi = { FILE_DISPOSITION_DELETE | FILE_DISPOSITION_POSIX_SEMANTICS };
if (!SetFileInformationByHandle(hFile1, FileDispositionInfoEx, &fdi, sizeof(fdi)))
{
print_error("SetFileInformationByHandle");
}
// file already not accessible here (open must fail) but visible
if (hFile3 = OpenFile(lpFileName, FILE_GENERIC_READ))
{
CloseHandle(hFile3);
}
ReadTest(hFile2);
// win10 rs1: file removed from the visible namespace here
CloseHandle(hFile1);
// are file still visible ?
if (hFile3 = OpenFile(lpFileName, FILE_GENERIC_READ))
{
CloseHandle(hFile3);
}
// are possible create new file with this name &
hFile3 = CreateFileW(lpFileName, DELETE,
FILE_SHARE_VALID_FLAGS, 0, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
if (hFile3 == INVALID_HANDLE_VALUE)
{
print_error("CreateFile");
}
else
{
CloseHandle(hFile3);
DbgPrint("CreateFile OK\n");
}
ReadTest(hFile2);
if (hFile2)
{
CloseHandle(hFile2);
}
}
}
和输出
OpenFile=c0000056
A non close operation has been requested of a file object with a delete pending.
ReadFile=OK
OpenFile=c0000034
Object Name not found.
CreateFile OK
ReadFile=OK
关于linux - 删除正在进行 I/O 的文件 : Is it a filesystem and/or an OS feature?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50228132/
我是一名优秀的程序员,十分优秀!