Re: хардлинки под NT4

From
Alex Fedotov ()
To
Alexei Duzhiy
Date
2002-03-28T07:21:10Z
Area
SU.WINDOWS.NT.PROG
From: "Alex Fedotov" <me@alexfedotov.com>

Alexei Duzhiy wrote:

> MSDN: "Hard links have been around since the inception of Windows NT, but
> not until Windows 2000 did Microsoft provide a public function to create
> them."
>
> Как же все-таки pаботать с хаpдлинками под NT4 если CreateHardLink
> появилась только в w2k?

Вот реализация CreateHardLink для NT4:

BOOL APIENTRY CreateHardLinkW(
    IN PCWSTR lpFileName,
    IN PCWSTR lpExistingFileName,
    IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
    )
{
    HANDLE hFile = CreateFileW(lpExistingFileName, FILE_WRITE_ATTRIBUTES,
                        FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                        lpSecurityAttributes, OPEN_EXISTING, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
        return FALSE;

    DWORD dwError = 0;

    DWORD cbWritten;
    WIN32_STREAM_ID StreamId;
    LPVOID pvContext = NULL;
    DWORD cbHeader;

    WCHAR szFilePath[MAX_PATH];
    LPWSTR pszNamePart;
    DWORD cchFilePath = GetFullPathNameW(lpFileName, MAX_PATH, szFilePath,
                                         &pszNamePart);
    if (cchFilePath == 0)
    {
        dwError = GetLastError();
        goto Cleanup;
    }

    StreamId.dwStreamId = BACKUP_LINK;
    StreamId.dwStreamAttributes = 0;
    StreamId.dwStreamNameSize = 0;
    StreamId.Size.HighPart = 0;
    StreamId.Size.LowPart = (cchFilePath + 1) * sizeof(WCHAR);

    cbHeader = (LPBYTE)&StreamId.cStreamName - (LPBYTE)&StreamId;

    if (!BackupWrite(hFile, (LPBYTE)&StreamId, cbHeader, &cbWritten,
                     FALSE, FALSE, &pvContext))
    {
        dwError = GetLastError();
        goto Cleanup;
    }

    if (!BackupWrite(hFile, (LPBYTE)szFilePath, StreamId.Size.LowPart,
                     &cbWritten, FALSE, FALSE, &pvContext))
        dwError = GetLastError();

    BackupWrite(hFile, NULL, 0, &cbWritten, TRUE, FALSE, &pvContext);

Cleanup:

    CloseHandle(hFile);
    SetLastError(dwError);
    return dwError == 0;
}

Смотри также:

Q234727 HOWTO: Create Hard Links in Windows NT and Windows 2000
http://support.microsoft.com/support/kb/articles/Q234/7/27.asp

-- Alex Fedotov



--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)