Files
mir_server/Gateway/common/utils/fdop.cc

242 lines
4.0 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#include <stdio.h>
#include <stdlib.h>
#include "os_def.h"
#include "_ast.h"
#include "share_util.h"
#include "fdop.h"
#ifndef _MSC_VER
#include <sys/stat.h>
#endif
using namespace FDOP;
bool FDOP::FileExists(const char* sFilePath)
{
#ifdef _MSC_VER
DWORD dwAttr = GetFileAttributes(sFilePath);
if (dwAttr == (DWORD) - 1)
return false;
else return true;
#else
if (!access(sFilePath, F_OK))
{
return true;
}
else
{
return false;
}
#endif
}
bool FDOP::DeepCreateDirectory(const char* sDirPath)
{
#ifdef _MSC_VER
char sPath[4096];
LPTSTR sPathPtr = sPath;
size_t dwNameLen, dwBufLen = ArrayCount(sPath) - 1;
DWORD dwAttr;
while (true)
{
dwNameLen = ExtractTopDirectoryName(sDirPath, &sDirPath, sPathPtr, dwBufLen);
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ƴ<EFBFBD><C6B3>ȳ<EFBFBD><C8B3><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (dwNameLen >= dwBufLen)
return false;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (dwNameLen == 0)
return true;
sPathPtr += dwNameLen;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>Ŀ¼
if (sPathPtr[-1] != ':')
{
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򴴽<EFBFBD><F2B4B4BD><EFBFBD>Ŀ¼
dwAttr = GetFileAttributes(sPath);
if ((dwAttr == (DWORD) - 1 && GetLastError() == ERROR_FILE_NOT_FOUND))
{
if (!CreateDirectory(sPath, NULL))
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>򷵻<EFBFBD>false
else if (!(dwAttr & FILE_ATTRIBUTE_DIRECTORY))
{
return false;
}
}
sPathPtr[0] = '\\';
sPathPtr++;
if (dwBufLen > dwNameLen)
dwBufLen -= dwNameLen + 1;
else dwBufLen = 0;
}
return false;
#else
char dirName[256];
_STRNCPY_A(dirName, sDirPath);
int len = strlen(dirName);
if (dirName[len - 1] != '/')
_STRNCAT_A(dirName, "/");
len = strlen(dirName);
for (int i = 1; i < len; i++)
{
if (dirName[i] == '/')
{
dirName[i] = 0;
if (access(dirName, F_OK) != 0)
{
if (mkdir(dirName, 0755) == -1)
{
//OutputMsg(rmError, "mkdir error, %s", dirName);
return false;
}
}
dirName[i] = '/';
}
}
return true;
#endif
}
size_t FDOP::ExtractFileDirectory(const char* sFilePath, char* sDirBuf, size_t dwBufLen)
{
const char* sDirEnd = sFilePath + strlen(sFilePath) - 1;
while (sDirEnd >= sFilePath && *sDirEnd != '/' && *sDirEnd != '\\')
{
sDirEnd--;
}
if (sDirEnd > sFilePath)
{
size_t dwNameLen = sDirEnd - sFilePath;
if (dwBufLen > 0)
{
if (dwBufLen > dwNameLen)
dwBufLen = dwNameLen;
else dwBufLen--;
memcpy(sDirBuf, sFilePath, sizeof(*sDirBuf) * dwBufLen);
sDirBuf[dwBufLen] = 0;
}
return dwNameLen;
}
return 0;
}
size_t FDOP::ExtractTopDirectoryName(const char* sDirPath, const char* *ppChildDirPath, char* sDirName, size_t dwBufLen)
{
const char* sNameEnd;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'/'<27><>'\'
while (*sDirPath && (*sDirPath == '/' || *sDirPath == '\\'))
{
sDirPath++;
}
sNameEnd = sDirPath;
//<2F><>λĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>
while (*sNameEnd)
{
if (*sNameEnd == '/' || *sNameEnd == '\\')
break;
sNameEnd++;
}
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
if (sNameEnd > sDirPath)
{
size_t dwNameLen = sNameEnd - sDirPath;
if (dwBufLen > 0)
{
if (dwBufLen > dwNameLen)
dwBufLen = dwNameLen;
else dwBufLen--;
memcpy(sDirName, sDirPath, sizeof(*sDirPath) * dwBufLen);
sDirName[dwBufLen] = 0;
if (ppChildDirPath)
*ppChildDirPath = sNameEnd;
}
return dwNameLen;
}
return 0;
}
size_t FDOP::ExtractFileName(const char* sFilePath, char* sNameBuf, size_t dwBufLen)
{
const char* sNameStart;
const char* sNameEnd = sFilePath + strlen(sFilePath) - 1;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'/'<27><>'\'
while (sNameEnd >= sFilePath && (*sNameEnd == '/' || *sNameEnd == '\\'))
{
sNameEnd--;
}
sNameStart = sNameEnd;
sNameEnd++;
//<2F><>λĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>λ<EFBFBD><CEBB>
while (sNameStart >= sFilePath)
{
if (*sNameStart == '/' || *sNameStart == '\\')
break;
sNameStart--;
}
sNameStart++;
//<2F><><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD>
if (sNameStart < sNameEnd)
{
size_t dwNameLen = sNameEnd - sNameStart;
if (dwBufLen > 0)
{
if (dwBufLen > dwNameLen)
dwBufLen = dwNameLen;
else dwBufLen--;
memcpy(sNameBuf, sNameStart, sizeof(*sNameStart) * dwBufLen);
sNameBuf[dwBufLen] = 0;
}
return dwNameLen;
}
return 0;
}