- Replaced FindFirstFile/FindClose with GetFileAttributesEx.

- Fixed some minor bugs.

svn path=/trunk/; revision=4879
This commit is contained in:
Hartmut Birr 2003-06-09 20:31:13 +00:00
parent 48be1aeb7d
commit a3048f0254
2 changed files with 101 additions and 89 deletions

View file

@ -10,8 +10,7 @@
int _stat(const char* path, struct stat* buffer) int _stat(const char* path, struct stat* buffer)
{ {
HANDLE findHandle; WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
WIN32_FIND_DATAA findData;
char* ext; char* ext;
if (!buffer) if (!buffer)
@ -26,38 +25,87 @@ int _stat(const char* path, struct stat* buffer)
return -1; return -1;
} }
findHandle = FindFirstFileA(path, &findData); if (!GetFileAttributesExA(path, GetFileExInfoStandard, &fileAttributeData))
if (findHandle == INVALID_HANDLE_VALUE)
{ {
__set_errno(ENOENT); __set_errno(ENOENT);
return -1; return -1;
} }
FindClose(findHandle);
memset (buffer, 0, sizeof(struct stat)); memset (buffer, 0, sizeof(struct stat));
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL); buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL); buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd; // statbuf->st_dev = fd;
buffer->st_size = findData.nFileSizeLow; buffer->st_size = fileAttributeData.nFileSizeLow;
buffer->st_mode = S_IREAD; buffer->st_mode = S_IREAD;
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR; buffer->st_mode |= S_IFDIR;
else else
{ {
buffer->st_mode |= S_IFREG; buffer->st_mode |= S_IFREG;
ext = strrchr(path, '.'); ext = strrchr(path, '.');
if (ext && (!stricmp(ext, ".exe") || if (ext && (!_stricmp(ext, ".exe") ||
!stricmp(ext, ".com") || !_stricmp(ext, ".com") ||
!stricmp(ext, ".bat") || !_stricmp(ext, ".bat") ||
!stricmp(ext, ".cmd"))) !_stricmp(ext, ".cmd")))
buffer->st_mode |= S_IEXEC; buffer->st_mode |= S_IEXEC;
} }
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
buffer->st_mode |= S_IWRITE; buffer->st_mode |= S_IWRITE;
return 0; return 0;
} }
__int64 _stati64 (const char *path, struct _stati64 *buffer)
{
WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
char* ext;
if (!buffer)
{
__set_errno(EINVAL);
return -1;
}
if(strchr(path, '*') || strchr(path, '?'))
{
__set_errno(ENOENT);
return -1;
}
if (!GetFileAttributesExA(path, GetFileExInfoStandard, &fileAttributeData))
{
__set_errno(ENOENT);
return -1;
}
memset (buffer, 0, sizeof(struct _stati64));
buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd;
buffer->st_size = ((((__int64)fileAttributeData.nFileSizeHigh) << 16) << 16) +
fileAttributeData.nFileSizeLow;
buffer->st_mode = S_IREAD;
if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR;
else
{
buffer->st_mode |= S_IFREG;
ext = strrchr(path, '.');
if (ext && (!_stricmp(ext, ".exe") ||
!_stricmp(ext, ".com") ||
!_stricmp(ext, ".bat") ||
!_stricmp(ext, ".cmd")))
buffer->st_mode |= S_IEXEC;
}
if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
buffer->st_mode |= S_IWRITE;
return 0;
}

View file

@ -10,8 +10,8 @@
int _wstat (const wchar_t *path, struct stat *buffer) int _wstat (const wchar_t *path, struct stat *buffer)
{ {
HANDLE findHandle; WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
WIN32_FIND_DATAW findData; wchar_t ext;
if (!buffer) if (!buffer)
{ {
@ -21,79 +21,38 @@ int _wstat (const wchar_t *path, struct stat *buffer)
if(wcschr(path, L'*') || wcschr(path, L'?')) if(wcschr(path, L'*') || wcschr(path, L'?'))
{ {
__set_errno(EINVAL); __set_errno(ENOENT);
return -1; return -1;
} }
findHandle = FindFirstFileW(path, &findData); if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
if (findHandle == INVALID_HANDLE_VALUE)
{ {
__set_errno(ENOENT); __set_errno(ENOENT);
return -1; return -1;
} }
FindClose(findHandle);
memset (buffer, 0, sizeof(struct stat)); memset (buffer, 0, sizeof(struct stat));
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL); buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL); buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd; // statbuf->st_dev = fd;
buffer->st_size = findData.nFileSizeLow; buffer->st_size = fileAttributeData.nFileSizeLow;
buffer->st_mode = S_IREAD; buffer->st_mode = S_IREAD;
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR; buffer->st_mode |= S_IFDIR;
else else
{
buffer->st_mode |= S_IFREG; buffer->st_mode |= S_IFREG;
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) ext = wcsrchr(path, L'.');
buffer->st_mode |= S_IWRITE; if (ext && (!_wcsicmp(ext, L".exe") ||
!_wcsicmp(ext, L".com") ||
return 0; !_wcsicmp(ext, L".bat") ||
} !_wcsicmp(ext, L".cmd")))
buffer->st_mode |= S_IEXEC;
__int64 _stati64 (const char *path, struct _stati64 *buffer)
{
HANDLE findHandle;
WIN32_FIND_DATAA findData;
if (!buffer)
{
__set_errno(EINVAL);
return -1;
} }
if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
if(strchr(path, '*') || strchr(path, '?'))
{
__set_errno(EINVAL);
return -1;
}
findHandle = FindFirstFileA(path, &findData);
if (findHandle == INVALID_HANDLE_VALUE)
{
__set_errno(ENOENT);
return -1;
}
FindClose(findHandle);
memset (buffer, 0, sizeof(struct stat));
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL);
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd;
buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) +
findData.nFileSizeLow;
buffer->st_mode = S_IREAD;
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR;
else
buffer->st_mode |= S_IFREG;
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
buffer->st_mode |= S_IWRITE; buffer->st_mode |= S_IWRITE;
return 0; return 0;
@ -101,8 +60,8 @@ __int64 _stati64 (const char *path, struct _stati64 *buffer)
__int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer) __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
{ {
HANDLE findHandle; WIN32_FILE_ATTRIBUTE_DATA fileAttributeData;
WIN32_FIND_DATAW findData; wchar_t ext;
if (!buffer) if (!buffer)
{ {
@ -112,34 +71,39 @@ __int64 _wstati64 (const wchar_t *path, struct _stati64 *buffer)
if(wcschr(path, L'*') || wcschr(path, L'?')) if(wcschr(path, L'*') || wcschr(path, L'?'))
{ {
__set_errno(EINVAL); __set_errno(ENOENT);
return -1; return -1;
} }
findHandle = FindFirstFileW(path, &findData); if (!GetFileAttributesExW(path, GetFileExInfoStandard, &fileAttributeData))
if (findHandle == INVALID_HANDLE_VALUE)
{ {
__set_errno(ENOENT); __set_errno(ENOENT);
return -1; return -1;
} }
FindClose(findHandle); memset (buffer, 0, sizeof(struct _stati64));
memset (buffer, 0, sizeof(struct stat)); buffer->st_ctime = FileTimeToUnixTime(&fileAttributeData.ftCreationTime,NULL);
buffer->st_atime = FileTimeToUnixTime(&fileAttributeData.ftLastAccessTime,NULL);
buffer->st_ctime = FileTimeToUnixTime(&findData.ftCreationTime,NULL); buffer->st_mtime = FileTimeToUnixTime(&fileAttributeData.ftLastWriteTime,NULL);
buffer->st_atime = FileTimeToUnixTime(&findData.ftLastAccessTime,NULL);
buffer->st_mtime = FileTimeToUnixTime(&findData.ftLastWriteTime,NULL);
// statbuf->st_dev = fd; // statbuf->st_dev = fd;
buffer->st_size = (((__int64)findData.nFileSizeHigh) << 32) + buffer->st_size = ((((__int64)fileAttributeData.nFileSizeHigh) << 16) << 16) +
findData.nFileSizeLow; fileAttributeData.nFileSizeLow;
buffer->st_mode = S_IREAD; buffer->st_mode = S_IREAD;
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) if (fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
buffer->st_mode |= S_IFDIR; buffer->st_mode |= S_IFDIR;
else else
{
buffer->st_mode |= S_IFREG; buffer->st_mode |= S_IFREG;
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) ext = wcsrchr(path, L'.');
if (ext && (!_wcsicmp(ext, L".exe") ||
!_wcsicmp(ext, L".com") ||
!_wcsicmp(ext, L".bat") ||
!_wcsicmp(ext, L".cmd")))
buffer->st_mode |= S_IEXEC;
}
if (!(fileAttributeData.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
buffer->st_mode |= S_IWRITE; buffer->st_mode |= S_IWRITE;
return 0; return 0;