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)