$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Anthony Williams (anthony.williamsNOSPAM_at_[hidden])
Date: 2003-05-23 07:41:24
Vladimir Prus <ghost_at_[hidden]> writes:
> Anthony Williams wrote:
>
> > Vladimir Prus <ghost_at_[hidden]> writes:
> >> > Shame about the "NT symlinks not supported yet" errors...
> >>
> >> Hmm... I hope someone more knowledgeble about NT will implement them
> >> someday. I even don't known is there's command line tool to create them.
> >
> > Within an NTFS partition you can create hard links for files. You can also
> > link directories within or across local drives, so c:/cdrom points to the
> > contents of the CDROM drive, and c:/boost_current points to
> > c:/libs/boost_1_30_0.
> >
> > I can provide code for doing the former; www.sysinternals.com provide a
> > tool (with source code) for doing the latter (junction).
>
> I've looked at the latter now, and would be very interesting in code for the
> former --- since hard links for files more closely match Unix links
> semantics.
The code below creates a file "c:\target", and then creates a link to it
called "c:\link".
The important things to note are:
* The link filename is UNICODE
* The link filename must be normalized, as if by calling
GetFullPathNameW. This means that directory separators have to be
backslashes not forward slashes, and .. and . components have been removed
Anthony
--
Anthony Williams
Senior Software Engineer, Beran Instruments Ltd.
Remove NOSPAM when replying, for timely response.
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
int main()
{
char const targetName[]="c:\\target";
// create the target
FILE * target=fopen(targetName,"w");
fprintf(target,"hello world\n");
fclose(target);
// open the target with backup semantics
HANDLE linkHandle=CreateFile(targetName,GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,NULL);
if(linkHandle==INVALID_HANDLE_VALUE)
{
printf("Error %08X creating file\n",GetLastError());
return 0;
}
wchar_t const linkName[]=L"c:\\link";
// prepare the link info
WIN32_STREAM_ID streamInfo;
streamInfo.dwStreamId=BACKUP_LINK;
streamInfo.dwStreamAttributes=0;
streamInfo.Size.LowPart=wcslen(linkName)*2+2;
streamInfo.Size.HighPart=0;
streamInfo.dwStreamNameSize=0;
// write the info
DWORD bytesWritten=0;
LPVOID context=0;
if(!BackupWrite(linkHandle,(unsigned char*)&streamInfo,
offsetof(WIN32_STREAM_ID,cStreamName),
&bytesWritten,FALSE,FALSE,&context))
{
CloseHandle(linkHandle);
printf("Error %08X creating link header\n",GetLastError());
return 0;
}
if(!BackupWrite(linkHandle,(unsigned char*)linkName,
wcslen(linkName)*2+2,
&bytesWritten,FALSE,FALSE,&context))
{
CloseHandle(linkHandle);
printf("Error %08X creating link filename\n",GetLastError());
return 0;
}
// end the backup write
if(!BackupWrite(linkHandle,0,0,&bytesWritten,TRUE,FALSE,&context))
{
printf("Error %08X closing link\n",GetLastError());
CloseHandle(linkHandle);
return 0;
}
CloseHandle(linkHandle);
}