void MIOFile_Parent (OOTstring pmNewPath, const OOTstring pmOldPath) { char myPath [4096]; char *myRoot, *myPtr; // Convert to full path name if (!MIOFile_ConvertPath (pmOldPath, myPath, NULL, NO_TRAILING_SLASH)) { // if MIOFile_ConvertPath returned false, then the error message was // set to indicate why. pmNewPath [0] = 0; return; } // return if root directory if (MIOFile_GetRootDir (myPath, &myRoot)) { strcpy (pmNewPath, pmOldPath); SET_ERRNO (E_FILE_CANNOT_GET_PARENT_OF_ROOT); return; } // At this point, we are guaranteed that the path does not end in a / // Back up until we reach a slash and discard it, or hit the root. myPtr = &myPath [strlen (myPath) - 1]; while (*myPtr != '/') { myPtr--; } if (myPtr < myRoot) { myPtr++; } strncpy (pmNewPath, myPath, myPtr - myPath); pmNewPath [myPtr - myPath] = 0; } // MIOFile_Parent
int MDIOFile_DiskFree (const char *pmPathName) { char myRootDir [1024]; FARPROC myGetDiskFreeSpaceExProc; BOOL myResult; const char *myPtr; UINT myPrevErrorMode; myGetDiskFreeSpaceExProc = GetProcAddress (GetModuleHandle("kernel32.dll"), "GetDiskFreeSpaceExA"); if (myGetDiskFreeSpaceExProc == NULL) { DWORD mySectPerClust, myBytesPerSect, myFreeClusters, myTotalClusters; // If GetDiskFreeSpaceEx is not available, we must get the root // directory of the current drive and pass it to GetDiskFreeSpace. MIOFile_GetRootDir (pmPathName, &myPtr); strncpy (myRootDir, pmPathName, myPtr - pmPathName); myRootDir [myPtr - pmPathName] = 0; // Windows 95 cannot look up disk free on a network share. if ((myRootDir [0] == '\\') && (myRootDir [1] == '\\')) { OSVERSIONINFO myOSVersionInfo; ZeroMemory (&myOSVersionInfo, sizeof (myOSVersionInfo)); myOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx (&myOSVersionInfo); // You cannot use CreateFile on a directory under Win 95/98/Me if ((myOSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (myOSVersionInfo.dwMajorVersion == 4) && (myOSVersionInfo.dwMinorVersion == 0)) { return -1; } } myPrevErrorMode = SetErrorMode (SEM_FAILCRITICALERRORS); myResult = GetDiskFreeSpace (myRootDir, &mySectPerClust, &myBytesPerSect, &myFreeClusters, &myTotalClusters); SetErrorMode (myPrevErrorMode); if (myResult) { return (mySectPerClust * myBytesPerSect * myFreeClusters); } } else { ULARGE_INTEGER myFreeBytesToCaller, myTotalBytes, myFreeBytes; ULONGLONG myLongFree; myPrevErrorMode = SetErrorMode (SEM_FAILCRITICALERRORS); myResult = myGetDiskFreeSpaceExProc (pmPathName, &myFreeBytesToCaller, &myTotalBytes, &myFreeBytes); SetErrorMode (myPrevErrorMode); if (myResult) { myLongFree = myFreeBytesToCaller.QuadPart; if (myLongFree > (ULONGLONG) 0x7FFFFFFF) { return (0x7FFFFFFF); } else { return ((int) myLongFree); } } } // An error occurred - process it. MDIO_ProcessMSWindowsError (GetLastError ()); return -1; } // MDIOFile_DiskFree