亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正在進行I / O刪除文件:它是文件系統和/或OS功能嗎?

正在進行I / O刪除文件:它是文件系統和/或OS功能嗎?

楊__羊羊 2021-04-09 15:15:04
我正在編寫將在Linux上運行但可以對已安裝分區上的文件進行操作的shell腳本,可能有也可能沒有ext *文件系統。例如,它可以是NTFS,FAT32或任何基于inode或基于非inode的系統;可以進一步將其重新安裝在其他運行非Linux操作系統(例如Windows或Mac)的機器上。此外,我的腳本需要能夠通過在Linux,Windows或Mac機器上運行的遠程進程刪除此共享的,任意格式的分區上的文件(即使正在讀取或寫入文件時)。問題:能夠刪除正在使用的文件的功能,一種。僅文件系統?b。還是只有操作系統?C。還是兩者的結合?(問題1的擴展)在文件上執行I / O和刪除文件的進程是本地的還是遠程的,這有關系嗎?
查看完整描述

2 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

在文件上執行I / O和刪除文件的I / O進程是本地的還是遠程的,這有關系嗎?


有趣的是-遠程系統如何直接在Windows上訪問文件(打開,讀寫數據,刪除)?真的,這不可能。我們需要一些在本地系統中運行的代理(LANMan服務器),該代理將通過遠程命令(由Network Redirector發送)對文件進行本地操作。因此,從文件系統視圖來看-所有操作始終是本地的。


能夠刪除正在使用的文件的功能


這當然是由文件系統驅動程序實現的,但是該驅動程序是為具體OS編寫的,并基于該規則。磁盤上的文件系統數據具有通用格式(因此,驅動器在一個OS中格式化(和寫入的文件),可以從另一OS讀?。?文件系統驅動程序如何處理請求,打開,讀取,寫入,刪除文件-這是特定于操作系統。針對不同的操作系統而有所不同。根據它的規則。因此磁盤上的數據格式是常見的,并且僅取決于文件系統。但是如何讀取/寫入/刪除此數據-已經特定于操作系統。


在Windows中,我們有刪除文件的下一條規則:


通常,只有在關閉了該文件的所有打開句柄并且該文件的鏈接計數為零時,才會真正刪除標記為刪除的文件。當使用FILE_DISPOSITION_POSIX_SEMANTICS將文件標記為刪除時 ,只要POSIX刪除句柄已關閉,該鏈接就會從可見的命名空間中刪除,但是其他現有句柄仍可訪問該文件的數據流,直到最后一個句柄已關閉。


因此,一般來說,文件不會被刪除,直到關閉文件的最后一個句柄為止。嘗試刪除文件后無法訪問該文件-無法再將其打開(我們收到錯誤消息,請求對具有待處理刪除操作的文件對象執行非關閉操作。如果嘗試這樣做,請在標記為刪除的文件之后進行)。但是如果文件已經打開-我們仍然可以通過此句柄使用它。如果文件上存在節,也無法刪除文件-將是錯誤試圖刪除無法刪除的文件或目錄。


從win10開始redstone1 build existFILE_DISPOSITION_POSIX_SEMANTICS標志,當刪除句柄關閉時,該文件允許從可見的命名空間中刪除文件名,但是其他現有句柄仍可訪問文件的數據流,直到最后一個句柄關閉為止


Windows代碼測試演示:(FILE_DISPOSITION_POSIX_SEMANTICS由ntfs支持僅從開始_WIN32_WINNT_WIN10_RS1。FileDispositionInfoEx信息類也_WIN32_WINNT_WIN10_RS1僅從支持開始。在以前的構建中,我們只是未實現錯誤)


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


查看完整回答
反對 回復 2021-04-16
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

這取決于您如何定義文件系統和操作系統。通常,我了解在文件系統下數據存儲在設備上的組織方式。然后,操作系統負責數據和文件的I / O。特別是,如果您的腳本想要刪除文件,它將調用rm之類的實用程序并提供文件名。該實用程序是一個進行適當的系統調用的程序。該系統調用是在特權模式下執行的操作系統的一部分。它實現了什么以及如何做(例如,應該使用哪些驅動程序將HDD塊標記為在特定驅動器上為空閑,或者應該調用某些遠程過程或涉及到samba服務器等。)因此,請回答您的問題1,我傾向于答案b。


查看完整回答
反對 回復 2021-04-16
  • 2 回答
  • 0 關注
  • 403 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號