FILE_BASIC_INFO info;
path_t _path = PATH_T_INITIALIZE("isdir", "path", 0, 1);
int result;
+ BOOL slow_path = TRUE;
+ FILE_STAT_BASIC_INFORMATION statInfo;
if (!path_converter(path, &_path)) {
path_cleanup(&_path);
}
Py_BEGIN_ALLOW_THREADS
- if (_path.fd != -1) {
- hfile = _Py_get_osfhandle_noraise(_path.fd);
- close_file = FALSE;
- }
- else {
- hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (_path.wide) {
+ if (_Py_GetFileInformationByName(_path.wide, FileStatBasicByNameInfo,
+ &statInfo, sizeof(statInfo))) {
+ if (!(statInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
+ slow_path = FALSE;
+ result = statInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ } else if (!(statInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+ slow_path = FALSE;
+ result = 0;
+ }
+ } else if (_Py_GetFileInformationByName_ErrorIsTrustworthy(GetLastError())) {
+ slow_path = FALSE;
+ result = 0;
+ }
}
- if (hfile != INVALID_HANDLE_VALUE) {
- if (GetFileInformationByHandleEx(hfile, FileBasicInfo, &info,
- sizeof(info)))
- {
- result = info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (slow_path) {
+ if (_path.fd != -1) {
+ hfile = _Py_get_osfhandle_noraise(_path.fd);
+ close_file = FALSE;
}
else {
- result = 0;
+ hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
}
- if (close_file) {
- CloseHandle(hfile);
- }
- }
- else {
- STRUCT_STAT st;
- switch (GetLastError()) {
- case ERROR_ACCESS_DENIED:
- case ERROR_SHARING_VIOLATION:
- case ERROR_CANT_ACCESS_FILE:
- case ERROR_INVALID_PARAMETER:
- if (STAT(_path.wide, &st)) {
- result = 0;
+ if (hfile != INVALID_HANDLE_VALUE) {
+ if (GetFileInformationByHandleEx(hfile, FileBasicInfo, &info,
+ sizeof(info)))
+ {
+ result = info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY;
}
else {
- result = S_ISDIR(st.st_mode);
+ result = 0;
+ }
+ if (close_file) {
+ CloseHandle(hfile);
+ }
+ }
+ else {
+ STRUCT_STAT st;
+ switch (GetLastError()) {
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ case ERROR_CANT_ACCESS_FILE:
+ case ERROR_INVALID_PARAMETER:
+ if (STAT(_path.wide, &st)) {
+ result = 0;
+ }
+ else {
+ result = S_ISDIR(st.st_mode);
+ }
+ break;
+ default:
+ result = 0;
}
- break;
- default:
- result = 0;
}
}
Py_END_ALLOW_THREADS
FILE_BASIC_INFO info;
path_t _path = PATH_T_INITIALIZE("isfile", "path", 0, 1);
int result;
+ BOOL slow_path = TRUE;
+ FILE_STAT_BASIC_INFORMATION statInfo;
if (!path_converter(path, &_path)) {
path_cleanup(&_path);
}
Py_BEGIN_ALLOW_THREADS
- if (_path.fd != -1) {
- hfile = _Py_get_osfhandle_noraise(_path.fd);
- close_file = FALSE;
- }
- else {
- hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (_path.wide) {
+ if (_Py_GetFileInformationByName(_path.wide, FileStatBasicByNameInfo,
+ &statInfo, sizeof(statInfo))) {
+ if (!(statInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
+ slow_path = FALSE;
+ result = !(statInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+ } else if (statInfo.FileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ slow_path = FALSE;
+ result = 0;
+ }
+ } else if (_Py_GetFileInformationByName_ErrorIsTrustworthy(GetLastError())) {
+ slow_path = FALSE;
+ result = 0;
+ }
}
- if (hfile != INVALID_HANDLE_VALUE) {
- if (GetFileInformationByHandleEx(hfile, FileBasicInfo, &info,
- sizeof(info)))
- {
- result = !(info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+ if (slow_path) {
+ if (_path.fd != -1) {
+ hfile = _Py_get_osfhandle_noraise(_path.fd);
+ close_file = FALSE;
}
else {
- result = 0;
- }
- if (close_file) {
- CloseHandle(hfile);
+ hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
}
- }
- else {
- STRUCT_STAT st;
- switch (GetLastError()) {
- case ERROR_ACCESS_DENIED:
- case ERROR_SHARING_VIOLATION:
- case ERROR_CANT_ACCESS_FILE:
- case ERROR_INVALID_PARAMETER:
- if (STAT(_path.wide, &st)) {
- result = 0;
+ if (hfile != INVALID_HANDLE_VALUE) {
+ if (GetFileInformationByHandleEx(hfile, FileBasicInfo, &info,
+ sizeof(info)))
+ {
+ result = !(info.FileAttributes & FILE_ATTRIBUTE_DIRECTORY);
}
else {
- result = S_ISREG(st.st_mode);
+ result = 0;
+ }
+ if (close_file) {
+ CloseHandle(hfile);
+ }
+ }
+ else {
+ STRUCT_STAT st;
+ switch (GetLastError()) {
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ case ERROR_CANT_ACCESS_FILE:
+ case ERROR_INVALID_PARAMETER:
+ if (STAT(_path.wide, &st)) {
+ result = 0;
+ }
+ else {
+ result = S_ISREG(st.st_mode);
+ }
+ break;
+ default:
+ result = 0;
}
- break;
- default:
- result = 0;
}
}
Py_END_ALLOW_THREADS
BOOL close_file = TRUE;
path_t _path = PATH_T_INITIALIZE("exists", "path", 0, 1);
int result;
+ BOOL slow_path = TRUE;
+ FILE_STAT_BASIC_INFORMATION statInfo;
if (!path_converter(path, &_path)) {
path_cleanup(&_path);
}
Py_BEGIN_ALLOW_THREADS
- if (_path.fd != -1) {
- hfile = _Py_get_osfhandle_noraise(_path.fd);
- close_file = FALSE;
- }
- else {
- hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
- }
- if (hfile != INVALID_HANDLE_VALUE) {
- result = 1;
- if (close_file) {
- CloseHandle(hfile);
+ if (_path.wide) {
+ if (_Py_GetFileInformationByName(_path.wide, FileStatBasicByNameInfo,
+ &statInfo, sizeof(statInfo))) {
+ if (!(statInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
+ slow_path = FALSE;
+ result = 1;
+ }
+ } else if (_Py_GetFileInformationByName_ErrorIsTrustworthy(GetLastError())) {
+ slow_path = FALSE;
+ result = 0;
}
}
- else {
- STRUCT_STAT st;
- switch (GetLastError()) {
- case ERROR_ACCESS_DENIED:
- case ERROR_SHARING_VIOLATION:
- case ERROR_CANT_ACCESS_FILE:
- case ERROR_INVALID_PARAMETER:
- if (STAT(_path.wide, &st)) {
- result = 0;
+ if (slow_path) {
+ if (_path.fd != -1) {
+ hfile = _Py_get_osfhandle_noraise(_path.fd);
+ close_file = FALSE;
+ }
+ else {
+ hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ }
+ if (hfile != INVALID_HANDLE_VALUE) {
+ result = 1;
+ if (close_file) {
+ CloseHandle(hfile);
}
- else {
- result = 1;
+ }
+ else {
+ STRUCT_STAT st;
+ switch (GetLastError()) {
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ case ERROR_CANT_ACCESS_FILE:
+ case ERROR_INVALID_PARAMETER:
+ if (STAT(_path.wide, &st)) {
+ result = 0;
+ }
+ else {
+ result = 1;
+ }
+ break;
+ default:
+ result = 0;
}
- break;
- default:
- result = 0;
}
}
Py_END_ALLOW_THREADS
FILE_ATTRIBUTE_TAG_INFO info;
path_t _path = PATH_T_INITIALIZE("islink", "path", 0, 1);
int result;
+ BOOL slow_path = TRUE;
+ FILE_STAT_BASIC_INFORMATION statInfo;
if (!path_converter(path, &_path)) {
path_cleanup(&_path);
}
Py_BEGIN_ALLOW_THREADS
- if (_path.fd != -1) {
- hfile = _Py_get_osfhandle_noraise(_path.fd);
- close_file = FALSE;
+ if (_path.wide) {
+ if (_Py_GetFileInformationByName(_path.wide, FileStatBasicByNameInfo,
+ &statInfo, sizeof(statInfo))) {
+ slow_path = FALSE;
+ if (statInfo.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+ result = (statInfo.ReparseTag == IO_REPARSE_TAG_SYMLINK);
+ }
+ else {
+ result = 0;
+ }
+ } else if (_Py_GetFileInformationByName_ErrorIsTrustworthy(GetLastError())) {
+ slow_path = FALSE;
+ result = 0;
+ }
}
- else {
- hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING,
- FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
- NULL);
- }
- if (hfile != INVALID_HANDLE_VALUE) {
- if (GetFileInformationByHandleEx(hfile, FileAttributeTagInfo, &info,
- sizeof(info)))
- {
- result = (info.ReparseTag == IO_REPARSE_TAG_SYMLINK);
+ if (slow_path) {
+ if (_path.fd != -1) {
+ hfile = _Py_get_osfhandle_noraise(_path.fd);
+ close_file = FALSE;
}
else {
- result = 0;
+ hfile = CreateFileW(_path.wide, FILE_READ_ATTRIBUTES, 0, NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
}
- if (close_file) {
- CloseHandle(hfile);
- }
- }
- else {
- STRUCT_STAT st;
- switch (GetLastError()) {
- case ERROR_ACCESS_DENIED:
- case ERROR_SHARING_VIOLATION:
- case ERROR_CANT_ACCESS_FILE:
- case ERROR_INVALID_PARAMETER:
- if (LSTAT(_path.wide, &st)) {
- result = 0;
+ if (hfile != INVALID_HANDLE_VALUE) {
+ if (GetFileInformationByHandleEx(hfile, FileAttributeTagInfo, &info,
+ sizeof(info)))
+ {
+ result = (info.ReparseTag == IO_REPARSE_TAG_SYMLINK);
}
else {
- result = S_ISLNK(st.st_mode);
+ result = 0;
+ }
+ if (close_file) {
+ CloseHandle(hfile);
+ }
+ }
+ else {
+ STRUCT_STAT st;
+ switch (GetLastError()) {
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ case ERROR_CANT_ACCESS_FILE:
+ case ERROR_INVALID_PARAMETER:
+ if (LSTAT(_path.wide, &st)) {
+ result = 0;
+ }
+ else {
+ result = S_ISLNK(st.st_mode);
+ }
+ break;
+ default:
+ result = 0;
}
- break;
- default:
- result = 0;
}
}
Py_END_ALLOW_THREADS