NT는이를 수행 할 수 있지만 Win32는이를 노출하지 않습니다. 이를 위해 NT API를 사용해야합니다. 특히 NtCreateFile
. 그것은 ZwCreateFile의 동일한 매개 변수를 따라야합니다.
HANDLE
CreateDirectoryAndGetHandle(PWSTR pszFileName)
{
NTSTATUS Status;
UNICODE_STRING FileName;
HANDLE DirectoryHandle;
IO_STATUS_BLOCK IoStatus;
OBJECT_ATTRIBUTES ObjectAttributes;
RtlInitUnicodeString(&FileName, pszFileName);
InitializeObjectAttributes(&ObjectAtributes, &FileName, 0, NULL, NULL);
Status = NtCreateFile(&DirectoryHandle,
GENERIC_READ | GENERIC_WRITE,
&ObjectAttributes,
&IoStatus,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_CREATE,
FILE_DIRECTORY_FILE,
NULL,
0);
if (NT_SUCCESS(Status))
{
return DirectoryHandle;
}
else
{
SetLastError(RtlNtStatusToDosError(Status));
return INVALID_HANDLE_VALUE;
}
}
주의해야 할 몇 가지 것들 ...
NT 경로가 약간 다른 규칙을 가지고있다 -
여기 (YMMV 웹 양식 내부 서둘러에서 해킹)을 예시입니다 Win32 경로보다 ... 경로를 위생해야 할 수도 있습니다.
HANDLE
에 대해 이야기 할 때 NT API는 일반적으로 INVALID_HANDLE_VALUE
이 아닌 NULL
을 처리합니다.
나는 여기에서하지 않았다.하지만 InitializeObjectAttributes
호출을 변경하면 다른 디렉토리 핸들과 관련된 생성 작업과 같이 흥미로운 작업을 수행 할 수있다. 물론 내가 여기에 넣은 깃발들도 바꿀 수 있습니다. 최상의 결과를 얻으려면 문서 및/또는 웹을 참조하십시오.
+1 올바른 방법이지만 지치지 마십시오. [documentation mentions] (http://msdn.microsoft.com/en-us/library/bb432200.aspx)와 같이이 함수는 " Windows의 한 릴리스에서 다음 릴리스로, 경우에 따라 각 릴리스의 서비스 팩 사이에서도 변경 될 수 있습니다. " 적어도 동적 런타임 링크를 통해 변경 또는 제거 된 경우 항상 이러한 함수에 액세스해야합니다. –
'CreateFile'은 실제로 디렉토리를 생성 할 수 있습니다. 처리를'CREATE_NEW'로 설정하고 플래그를'FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS | FILE_ATTRIBUTE_DIRECTORY'. 이것은 문서화되지 않았기 때문에 ReactOS와 Wine에서 구현되지 않았을 것입니다. 파이썬과 같은 스크립팅 환경에 있다면 헤더 (0x01000000)에서 올바른 값인 FILE_FLAG_POSIX_SEMANTICS를 사용해야합니다. MSDN에 나열된 값은 항상 잘못되었습니다. – eryksun
NTFS의 경우'$ INDEX_ALLOCATION' 속성을 만들 수도 있습니다. 명령 프롬프트에'mkdir dirname'이라는 어리석은 버전이 있습니다 :'type nul> dirname :: $ INDEX_ALLOCATION'. 물론 FAT32 드라이브에서는 작동하지 않습니다. – eryksun