2021-10-21文件夹处理

namespace UploadUtils
{
    
    
	// 判断程序是否已经启动
	bool IsAlreadyRunning();

	// 字符串转换
	char* ConvertLPSTRToLPSTR(LPCTSTR lpwszStrIn);

	// 创建文件目录
	void CreateDir(const char *dir);

	// 读取某给定路径下的当前文件夹名
	void GetCurrentDir(string path, vector<string>& dirs);

	// 判断某给定路径下的目录是否为空
	bool JudgeDirIsEmpty(string path);

	// 文件是否存在(文件/文件夹)
	bool IsFileExist(LPCTSTR filePath);

	// 是否是文件夹
	bool IsDir(LPCTSTR filePath);

	// 获得path路径(文件夹)下的所有文件名称(不包含路径,包含后缀)
	void GetFiles(LPCTSTR path, std::vector<fstring>& files);

	// 删除目录下文件(需要保证文件夹内的文件没有被占用)
	int DeleteDir(LPCTSTR pSrc, bool bIncludeDir = true);

	// 通过项目代号得到项目路径
	bool GetProjFolder(const char* pProjCode, fstring& strProjFolder);
}
namespace UploadUtils
{
    
    
	bool IsAlreadyRunning()
	{
    
    
		bool bRet = false;
		HANDLE hMutex = CreateMutex(NULL, TRUE, _T("UploadFileMutex"));
		if ( (hMutex != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS) )
		{
    
    
			bRet = true;
		}

		if (hMutex)
		{
    
    
			::ReleaseMutex(hMutex);
		}

		return bRet;
	}

	char* ConvertLPSTRToLPSTR(LPCTSTR lpszStrIn)
	{
    
    
		LPSTR pszOut = NULL;
		if (lpszStrIn != NULL)
		{
    
    
			int nInputStrLen = wcslen(lpszStrIn);

			// Double NULL Termination
			int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, lpszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
			pszOut = new char[nOutputStrLen];

			if (pszOut)
			{
    
    
				memset(pszOut, 0x00, nOutputStrLen);
				WideCharToMultiByte(CP_ACP, 0, lpszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
			}
		}
		return pszOut;
	}

	void CreateDir(const char *dir)
	{
    
    
		int m = 0, n = 0;
		string str1, str2;

		str1 = dir;
		if (str1.size() <= 3)
			return;

		str2 = str1.substr( 0, 2 );
		str1 = str1.substr( 3, str1.size() );

		while( m >= 0 )
		{
    
    
			m = str1.find('\\');

			str2 += '\\' + str1.substr( 0, m );    
			n = _access( str2.c_str(), 0 ); //判断该目录是否存在
			if( n == -1 )
			{
    
    
				_mkdir(str2.c_str());
			}

			str1 = str1.substr( m+1, str1.size() );
		}
	}

	void GetCurrentDir(string path, vector<string>& dirs)
	{
    
    
		// 文件句柄
		long hFile = 0;
		struct _finddata_t fileinfo;
		string p;
		if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1)
		{
    
    
			do {
    
      
				if ((fileinfo.attrib & _A_SUBDIR) && strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) 
				{
    
      
					dirs.push_back(fileinfo.name);
				}
			} while (_findnext(hFile, &fileinfo) == 0);
			_findclose(hFile);
		}
	}

	bool JudgeDirIsEmpty(string path)
	{
    
    
		// 文件句柄
		long hFile = 0;
		struct _finddata_t fileinfo;
		string p;
		if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) != -1)
		{
    
    
			do {
    
      
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) 
				{
    
      
					return false;
				}
			} while (_findnext(hFile, &fileinfo) == 0);
			_findclose(hFile);
		}

		return true;
	}

	bool IsFileExist(LPCTSTR filePath)
	{
    
    
		DWORD ftyp = GetFileAttributes(filePath);
		if (ftyp == INVALID_FILE_ATTRIBUTES)
		{
    
    
			// 文件/文件夹不存在
			return false;
		}

		return true;
	}

	bool IsDir(LPCTSTR filePath)
	{
    
    
		DWORD ftyp = GetFileAttributes(filePath);

		if (ftyp & FILE_ATTRIBUTE_DIRECTORY)
		{
    
    
			// 这是一个文件夹
			return true;
		}

		return false;
	}

	void GetFiles(LPCTSTR path, std::vector<fstring>& files)
	{
    
    

		HANDLE hFile = 0;
		WIN32_FIND_DATA fileInfo;
		memset(&fileInfo, 0, sizeof(LPWIN32_FIND_DATA));

		fstring wsTemp(path);
		if (_T("\\") != wsTemp.substr(wsTemp.length() - 2))
		{
    
    
			wsTemp.append(_T("\\"));
		}
		wsTemp.append(_T("*"));

		hFile = FindFirstFile(wsTemp.c_str(), &fileInfo);
		if (INVALID_HANDLE_VALUE == hFile)
		{
    
    
			return;
		}

		do
		{
    
    
			//如果是当前目录或者是上级目录,就直接进入下一次循环  
			if ('.' == fileInfo.cFileName[0])
			{
    
    
				continue;
			}

			files.push_back(fileInfo.cFileName);

		} while (FindNextFile(hFile, &fileInfo));

		FindClose(hFile);
	}

	int DeleteDir(LPCTSTR pSrc, bool bIncludeDir /*= true*/)
	{
    
    
		//RemoveDirectory
		if (NULL == pSrc)
		{
    
    
			return -1;
		}

		if (!IsFileExist(pSrc))
		{
    
    
			// 源文件不存在
			return -1;
		}

		// 若是文件则删除文件
		if (!IsDir(pSrc))
		{
    
    
			DeleteFile(pSrc);
		}

		// 遍历得到目录下所有文件
		std::vector<fstring> files;
		GetFiles(pSrc, files);

		for (std::vector<fstring>::iterator i = files.begin(); i != files.end(); ++i)
		{
    
    
			// 源位置
			fstring sTemp(pSrc);
			sTemp.append(_T("\\")).append(*i);
			LPCTSTR srcName = sTemp.c_str();

			if (IsDir(srcName))
			{
    
    
				DeleteDir(srcName);
			}
			else
			{
    
    
				DeleteFile(srcName);
			}
		}

		if (bIncludeDir)
		{
    
    
			RemoveDirectory(pSrc);
		}
		
		return 1;
	}

	bool GetProjFolder(const char* pProjCode, fstring& strProjFolder)
	{
    
    
		if (pProjCode == NULL)
			return false;
		
		WCHAR wszFolder[256];
		memset(wszFolder, 0x00, sizeof(wszFolder));
		MultiByteToWideChar(CP_ACP, 0, pProjCode, strlen(pProjCode) + 1, wszFolder, sizeof(wszFolder) / sizeof(wszFolder[0]));

		// 目前仅支持ecp模式
		strProjFolder = CHCDataSources::GetInstance()->GetDepotPath(_T("ecp"));

		// 去除路径前缀
		fstring strPrefix = _T("\\\\?\\");
		int nPos = strProjFolder.find(strPrefix);
		if (nPos != string::npos)
		{
    
    
			strProjFolder.erase(nPos, strPrefix.length());
		}
		strProjFolder += wszFolder;

		if (!IsDir(strProjFolder.c_str()))
			return false;

		return true;
	}
}

猜你喜欢

转载自blog.csdn.net/m0_37251750/article/details/120891224