GrabBag/VrUtils/Src/VrFileUtils.cpp

276 lines
6.0 KiB
C++
Raw Normal View History

2025-06-08 12:48:04 +08:00
#include "VrFileUtils.h"
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <fstream>
#include <sys/stat.h>
#include <cstdio>
#include <cstring>
#ifdef _WIN32
#include <Windows.h>
#include <direct.h>
#include <io.h>
#else
#include <unistd.h>
#endif
bool CVrFileUtils::IsFileExist(const char* pFileName)
{
std::ifstream in(pFileName);
return in.good();
}
size_t CVrFileUtils::GetFileSize(const char* fileName)
{
std::ifstream in(fileName);
in.seekg(0, std::ios::end);
size_t size = in.tellg();
in.close();
return (int)size;
}
bool CVrFileUtils::WriteFileData(const char* pFileName, const char* pData, const size_t nLen, bool isAppend)
{
if(!pFileName || !pData)
return false;
bool bRet = false;
std::ofstream fStream;
std::ios_base::openmode nMode = std::ios::binary;
if(isAppend)
{
nMode = nMode | std::ios::app;
}
fStream.open(pFileName, nMode);
bRet = fStream.good();
if(bRet)
{
fStream.write(pData, nLen);
fStream.flush();
}
fStream.close();
#ifndef _WIN32
sync();
#endif
return bRet;
}
bool CVrFileUtils::ReadFileData(const char* pFileName, char* pData, size_t* pLen, const int nOffset)
{
if(!pFileName)
return false;
int nFileSize = GetFileSize(pFileName);
if(nOffset >= nFileSize)
{
return false;
}
if(nFileSize - nOffset < *pLen)
{
*pLen = nFileSize - nOffset;
}
std::ifstream iStream(pFileName, std::ios::binary);
iStream.seekg(nOffset);
iStream.read(pData, *pLen);
iStream.close();
return true;
}
bool CVrFileUtils::GetFileList(std::string& pDirPath, std::string exd, std::vector<std::string>& vetFiles)
{
#ifdef _WIN32
//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
intptr_t hFile = 0;
//<2F>ļ<EFBFBD><C4BC><EFBFBD>Ϣ
struct _finddata_t fileinfo;
std::string pathName, exdName;
if (0 != strcmp(exd.c_str(), ""))
{
exdName = "\\*." + exd;
}
else
{
exdName = "\\*";
}
if ((hFile = _findfirst(pathName.assign(pDirPath).append(exdName).c_str(), &fileinfo)) != -1)
{
do
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>,<2C><><EFBFBD><EFBFBD>֮
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
std::string sFilePath = pathName.assign(pDirPath).append("\\").append(fileinfo.name);
GetFileList(sFilePath, exd, vetFiles);
}
}
else
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
vetFiles.push_back(pathName.assign(pDirPath).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
#endif
return true;
}
/// <20><>ȡĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
bool CVrFileUtils::GetDirList(std::string& pDirPath, std::vector<std::string>& vetFiles)
{
#if 0
// <20><><EFBFBD><EFBFBD>Ŀ¼
DIR* dir = opendir(pDirPath.c_str());
if (dir == nullptr) {
std::cerr << "Unable to open directory: " << pDirPath << std::endl;
return false;
}
struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
const std::string name = entry->d_name;
// <20>ų<EFBFBD> "." <20><> ".."
if (name != "." && name != "..") {
const std::string full_path = pDirPath + "/" + name;
struct stat info;
if (stat(full_path.c_str(), &info) == 0) {
if (S_ISDIR(info.st_mode)) {
subdirs.push_back(full_path); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>򱣴<EFBFBD>·<EFBFBD><C2B7>
}
}
}
}
closedir(dir); // <20>ر<EFBFBD>Ŀ¼<C4BF><C2BC>
#endif
return true;
}
bool CVrFileUtils::ReNameFile(const char* oldName, const char* newName)
{
if (!IsFileExist(oldName)) return false;
return 0 == rename(oldName, newName);
}
bool CVrFileUtils::DeleteLocalFile(const char* sFileName)
{
if (!IsFileExist(sFileName)) return false;
return 0 == remove(sFileName);
}
/// Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool CVrFileUtils::IsDirExist(const char* szDirectory)
{
if (nullptr == szDirectory)
{
return false;
}
struct stat sStat;
memset(&sStat, 0, sizeof(struct stat));
if (0 != stat(szDirectory, &sStat))
return false;
return true;
}
bool _CreateDirs(const std::string& path) {
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
struct stat info;
if (stat(path.c_str(), &info) == 0 && (info.st_mode & S_IFDIR))
{
return true;
}
// <20>ݹ鴴<DDB9><E9B4B4><EFBFBD><EFBFBD>Ŀ¼
#ifdef _WIN32
size_t pos = path.find_last_of('\\');
#else
size_t pos = path.find_last_of('/');
#endif // _WIN32
if (pos != std::string::npos) {
std::string parent_path = path.substr(0, pos);
if (!_CreateDirs(parent_path)) {
return false;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰĿ¼
#ifdef _WIN32
int nMkdirRet = mkdir(path.c_str());
#else
int nMkdirRet = mkdir(path.c_str(), 0777);
#endif // __WIN32
if (nMkdirRet == -1) {
perror("mkdir");
return false;
}
return true;
}
bool _DeleteDirs(const std::string& path)
{
// <20><><EFBFBD><EFBFBD>Ŀ¼<C4BF>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
struct stat info;
if (stat(path.c_str(), &info) == 0 && (info.st_mode & S_IFDIR))
{
std::cout << "Directory already exists: " << path << std::endl;
return true;
}
int nRet = rmdir(path.c_str());
return 0 == nRet;
}
/// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD>
bool CVrFileUtils::CreatNewDir(const char* szPath)
{
return _CreateDirs(szPath);
}
/// ɾ<><C9BE>Ŀ¼
bool CVrFileUtils::DeleteDir(const char* szDirPath)
{
return _DeleteDirs(szDirPath);
}
/// ȥ<><C8A5><EFBFBD><EFBFBD>׺<EFBFBD><D7BA>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
std::string CVrFileUtils::GetFileName(const std::string& filePath, bool bHasSuffix)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>б<EFBFBD>ܻ<EFBFBD><DCBB><EFBFBD>б<EFBFBD>ܵ<EFBFBD>λ<EFBFBD><CEBB>
size_t slashIndex = filePath.find_last_of("/\\");
// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
std::string fileName = (slashIndex != std::string::npos) ? filePath.substr(slashIndex + 1) : filePath;
if(!bHasSuffix)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
size_t dotIndex = fileName.find_last_of(".");
// ȥ<><C8A5><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>
if (dotIndex != std::string::npos) {
fileName = fileName.substr(0, dotIndex);
}
}
return fileName;
}