[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Some trouble with NSFileManager on windows
From: |
Roland Schwingel |
Subject: |
Some trouble with NSFileManager on windows |
Date: |
Mon, 08 Mar 2010 11:41:14 +0100 |
User-agent: |
Thunderbird 2.0.0.23 (Windows/20090812) |
Hi...
On windows I got some trouble with the movePath: in NSFileManager if you
move a file especially on a so called "VMWare Shared Folder".
I tracked it down to the fact that on windows GNUstep is currently not
able to get the fileSystemNumber. It is simply not implemented.
Furthermore if you call fileSystemAttributesAtPath: on a file on windows
this call fails always (independant of the "VMWare Shared Folder"). So
the movePath: method of NSFileManager optimizes wrong here.
The attached (mostly trivial) patch adds an implementation for the
missing fileSystemNumber thing and also fixes the
fileSystemAttributesAtPath: thing.
Thanks for applying,
Roland
--- NSFileManager.m.orig 2010-03-03 12:05:30.000000000 +0100
+++ NSFileManager.m 2010-03-08 10:39:12.000000000 +0100
@@ -192,7 +192,7 @@
#define _CLOSEDIR(A) _wclosedir(A)
#define _OPENDIR(A) _wopendir(A)
#define _READDIR(A) _wreaddir(A)
-#define _RENAME(A,B) _wrename(A,B)
+#define _RENAME(A,B)
(MoveFileExW(A,B,MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH)==0)?-1:0
#define _RMDIR(A) _wrmdir(A)
#define _STAT(A,B) _wstat(A,B)
#define _UTIME(A,B) _wutime(A,B)
@@ -1778,9 +1778,18 @@
};
DWORD SectorsPerCluster, BytesPerSector, NumberFreeClusters;
DWORD TotalNumberClusters;
+ DWORD volumeSerialNumber = 0;
const _CHAR *lpath = [self fileSystemRepresentationWithPath: path];
- if (!GetDiskFreeSpaceW(lpath, &SectorsPerCluster,
+ _CHAR volumePathName[128];
+ if (!GetVolumePathNameW(lpath,volumePathName,128))
+ {
+ return nil;
+ }
+
+
GetVolumeInformationW(volumePathName,NULL,0,&volumeSerialNumber,NULL,NULL,NULL,0);
+
+ if (!GetDiskFreeSpaceW(volumePathName,&SectorsPerCluster,
&BytesPerSector, &NumberFreeClusters, &TotalNumberClusters))
{
return nil;
@@ -1797,7 +1806,7 @@
values[1] = [NSNumber numberWithUnsignedLongLong: freesize];
values[2] = [NSNumber numberWithLong: LONG_MAX];
values[3] = [NSNumber numberWithLong: LONG_MAX];
- values[4] = [NSNumber numberWithUnsignedInt: 0];
+ values[4] = [NSNumber numberWithUnsignedInt: volumeSerialNumber];
return [NSDictionary dictionaryWithObjects: values forKeys: keys count: 5];
@@ -3227,7 +3236,18 @@
- (NSUInteger) fileSystemNumber
{
+#if defined(__MINGW32__)
+ DWORD volumeSerialNumber = 0;
+ _CHAR volumePathName[128];
+ if (GetVolumePathNameW(_path,volumePathName,128))
+ {
+
GetVolumeInformationW(volumePathName,NULL,0,&volumeSerialNumber,NULL,NULL,NULL,0);
+ }
+
+ return (NSUInteger)volumeSerialNumber;
+#else
return statbuf.st_dev;
+#endif
}
- (NSString*) fileType
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Some trouble with NSFileManager on windows,
Roland Schwingel <=