zoukankan      html  css  js  c++  java
  • 【C/C++】设置磁盘剩余空间

    const DWORD g_sysReserveBytes = 5 * 1024;
    const tstring g_diskEmulatorFileName = _T("DiskEmulatorFile_1C14D9BC-3056-4fdf-9BE5-CEFC9C7EF074");
    tstring GetDiskName(const char* disk)
    {
        tstring __disk;
        if (NULL == disk)
        {
            tstring curDir;
            GetMainModuleDir(curDir);
            assert(curDir.size() >= 2);
            __disk = curDir.substr(0, 2);
        }
        else
        {
            __disk = Utf8ToTStr(disk);
        }
    
        return __disk;
    }
    
    bool IsFreeSpaceEnough(DWORD freeSpaceBytes, const char* disk/* = NULL*/)
    {
        RemoveDiskEmulatorFile(disk);
        bool result = false;
        tstring __disk = GetDiskName(disk);
    
        ULARGE_INTEGER avalBytes = {0};
        if (GetDiskFreeSpaceEx(__disk.c_str(), &avalBytes, NULL, NULL))
        {
            result = (avalBytes.HighPart > 0) || ((__int64)avalBytes.LowPart > (__int64(freeSpaceBytes) + g_sysReserveBytes));
        }
    
        return result;
    }
    
    bool SetFreeSpaceBytes(DWORD freeSpaceBytes, const char* disk/* = NULL*/)
    {
        RemoveDiskEmulatorFile(disk);
        bool result = false;
        tstring __disk = GetDiskName(disk);
    
        ULARGE_INTEGER avalBytes = {0};
        if (GetDiskFreeSpaceEx(__disk.c_str(), &avalBytes, NULL, NULL))
        {
            __int64    totalSize = (((__int64)avalBytes.HighPart) << 32) + avalBytes.LowPart;
            if (((__int64)freeSpaceBytes + g_sysReserveBytes) <= totalSize)
            {
                __int64 emulatorFileSize = totalSize - freeSpaceBytes;
                DWORD high = (DWORD)(emulatorFileSize >> 32);
                DWORD low = (DWORD)(emulatorFileSize & 0xffffffff);
                HANDLE file = CreateFile(JoinPath(__disk, g_diskEmulatorFileName).c_str(),
                                        GENERIC_READ | GENERIC_WRITE,
                                        0,
                                        NULL,
                                        CREATE_ALWAYS,
                                        FILE_ATTRIBUTE_NORMAL,
                                        NULL);
                if (file != INVALID_HANDLE_VALUE)
                {
                    SetFilePointer(file, low, (PLONG)&high, FILE_BEGIN);
                    if (SetEndOfFile(file) != FALSE)
                    {
                        result = true;
                    }
                    CloseHandle(file);
                }
            }
        }
    
        return result;
    }
    
    bool RemoveDiskEmulatorFile(const char* disk/* = NULL*/)
    {
        bool result = true;
        tstring filePath = JoinPath(GetDiskName(disk), g_diskEmulatorFileName);
        if (FileExists(filePath))
        {
            result = (_tremove(filePath.c_str()) == 0);
        }
    
        return result;
    }
  • 相关阅读:
    如何将自己的镜像上传到私库
    基于spring-cloud的微服务(1) 服务注册中心eureka
    关于对象池技术的一些记录
    为Docker容器中运行的gitlab添加ssh的一些问题记录
    使用java实现的socket代理(支持socket4和socket5)
    ConfluenceRemoteUserAuth
    JiraRemoteUserAuth
    Apache 的mod_auth_cas模块的介绍和使用
    基于乌班图的标准镜像添加中文支持
    apache反向代解决绝对路径可能出现的问题
  • 原文地址:https://www.cnblogs.com/jeJee/p/2675182.html
Copyright © 2011-2022 走看看