1

特に便利というわけではありませんが、ファイルが削除された後でもページがたまたまメモリ内に残っているため、次のように機能する理由が気になります。どの場合、ページがスワップアウトされるとデータが失われますか?

#include <iostream>
#include <memory>
#include <windows.h>

int main()
{
    typedef std::unique_ptr<void, decltype(&CloseHandle)> Handle;
    typedef std::unique_ptr<void, decltype(&UnmapViewOfFile)> View;

    View v(nullptr, UnmapViewOfFile);

    {
        Handle h(CreateFile(
            L"test",
            GENERIC_READ | GENERIC_WRITE,
            0,
            nullptr,
            CREATE_ALWAYS,
            FILE_FLAG_DELETE_ON_CLOSE,
            nullptr
        ), CloseHandle);

        // write something so CreateFileMapping succeeds
        DWORD sz;
        WriteFile(h.get(), "hello world", 12, &sz, nullptr);

        Handle m(CreateFileMapping(
            h.get(),
            nullptr,
            PAGE_READWRITE,
            0, 0,
            nullptr
        ), CloseHandle);

        v.reset(MapViewOfFile(
            m.get(),
            FILE_MAP_WRITE,
            0, 0,
            0
        ));

        char c;
        std::cin >> c; // File is still in folder
    }

    char c;
    std::cin >> c; // No file!

    std::cout << static_cast<char*>(v.get()); // Still writes
}
4

2 に答える 2

2

FILE_FLAG_DELETE_ON_CLOSEリンク解除操作を「削除」と呼ぶという不幸なWindowsの伝統に従います。実際、フラグは、ファイルが閉じられたときにのみ、指定されたディレクトリからファイルのリンクを解除します。

他のオペレーティングシステムと同様に、Windowsは通常のユーザーコードに特定のディレクトリからファイルのリンクを解除する機能のみを提供します。削除は常にオペレーティングシステムの決定であり、ファイルを参照できなくなったときに行われます。

見てみると、ファイルは実際にはディレクトリからリンク解除されていることがわかりますが、参照カウントがゼロになるまで、ファイルは実際には削除されません(また、データがディスク上で再利用できるスペース)。マッピングは参照を保持します。

于 2012-06-19T10:50:26.200 に答える