Example #1
0
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