DirFile.cpp
上传用户:hbzxgg2
上传日期:2009-03-28
资源大小:291k
文件大小:7k
源码类别:

Windows Mobile

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "DirFile.h"
  3. /********************************************************************************
  4. * Function Type : Global
  5. * Parameter : filename - 文件名
  6. * data - 要保存的数据
  7. * mode - 文件打开的模式
  8. * size - 数据大小
  9. * nStartPos - 文件开始位置
  10. * Return Value : >=0 - 写入文件的大小
  11. * -1 - 写操作失败
  12. * Description : 保存数据到文件
  13. *********************************************************************************/
  14. int WriteDataToFile(LPCTSTR filename,void* data,long size,LPCTSTR mode, int nStartPos/*=-1*/ )
  15. {
  16. char szFileName[MAX_PATH] = {0};
  17. char szMode[8] = {0};
  18. if ( GetMltiByteChar ( filename, szFileName, sizeof(szFileName) ) < 1 )
  19. return -1;
  20. GetMltiByteChar(mode,szMode,sizeof(szMode));
  21. FILE *fp;
  22. long retval;
  23. fp=fopen((const char*)szFileName,(const char*)szMode );
  24. if ( fp!=NULL)
  25. {
  26. if ( nStartPos >= 0 )
  27. {
  28. if ( fseek ( fp, nStartPos, SEEK_SET ) != 0 )
  29. return -1;
  30. }
  31. retval = (long)fwrite(data,sizeof(char),size,fp);
  32. fclose(fp);
  33. if(retval != size)
  34. {
  35. return -1;
  36. }
  37. else  return retval;
  38. }
  39. else
  40. {
  41. return -1;
  42. }
  43. }
  44. /********************************************************************************
  45. * Function Type : Global
  46. * Parameter : filename - 文件名
  47. * data - 读到的数据存于此缓冲
  48. * size - 缓冲大小
  49. * nStartPos - 文件开始位置
  50. * Return Value : >=0 - 读到数据的大小
  51. * -1 - 操作失败
  52. * Description : 从文件中读取数据
  53. *********************************************************************************/
  54. int ReadDataFromFile(LPCTSTR filename,void* data,long size, int nStartPos/*=-1*/)
  55. {
  56. char szFileName[MAX_PATH] = {0};
  57. if ( GetMltiByteChar ( filename, szFileName, sizeof(szFileName) ) < 1 )
  58. return -1;
  59. FILE *fp;
  60. long retval;
  61. fp=fopen((const char*)szFileName,"rb");
  62. if ( fp!=NULL)
  63. {
  64. if ( nStartPos >= 0 )
  65. {
  66. if ( fseek ( fp, nStartPos, SEEK_SET ) != 0 )
  67. return -1;
  68. }
  69. retval = (long)fread(data,sizeof(char), size, fp);
  70. fclose(fp);
  71. if ( retval >= 0 ) return retval;
  72. }
  73. return -1;
  74. }
  75. //
  76. // 标准化路径或文件名,把不符合文件名命名规则的字符替换成指定的字符。
  77. // 加上该函数
  78. //
  79. CString StandardizationFileForPathName ( LPCTSTR lpszFileOrPathName, BOOL bIsFileName, char cReplaceChar/*=_T('_')*/ )
  80. {
  81. CString csFileOrPathName = GET_SAFE_STRING(lpszFileOrPathName);
  82. CString csHead, csTail;
  83. // 路径名中最后一个'\'是正常的。另外类似“c:\”的字符也是正常的。所以先提取出来不参与后面的替换,等替换完以后再补回来
  84. if ( !bIsFileName )
  85. {
  86. if ( csFileOrPathName.GetLength() >= 1 && (csFileOrPathName[csFileOrPathName.GetLength()-1] == _T('\') || csFileOrPathName[csFileOrPathName.GetLength()-1] == _T('/')) )
  87. {
  88. csTail += csFileOrPathName[csFileOrPathName.GetLength()-1];
  89. csFileOrPathName = csFileOrPathName.Left ( csFileOrPathName.GetLength()-1 );
  90. }
  91. if ( csFileOrPathName.GetLength() >= 2 && isalpha(csFileOrPathName[0]) && csFileOrPathName[1]==_T(':') )
  92. {
  93. csHead = csFileOrPathName.Left(2);
  94. csFileOrPathName = csFileOrPathName.Mid(2);
  95. }
  96. if ( csFileOrPathName.GetLength() >= 1 && (csFileOrPathName[0]==_T('\') || csFileOrPathName[0]==_T('/')) )
  97. {
  98. csHead += csFileOrPathName[0];
  99. csFileOrPathName = csFileOrPathName.Mid(1);
  100. }
  101. }
  102. else
  103. {
  104. csFileOrPathName.Replace ( _T("\"), _T("_") );
  105. csFileOrPathName.Replace ( _T("/"), _T("_") );
  106. }
  107. csFileOrPathName.Replace ( _T(":"), _T("_") );
  108. csFileOrPathName.Replace ( _T("*"), _T("_") );
  109. csFileOrPathName.Replace ( _T("?"), _T("_") );
  110. csFileOrPathName.Replace ( _T("""), _T("_") );
  111. csFileOrPathName.Replace ( _T("<"), _T("_") );
  112. csFileOrPathName.Replace ( _T(">"), _T("_") );
  113. csFileOrPathName.Replace ( _T("|"), _T("_") );
  114. csFileOrPathName.Insert ( 0, csHead );
  115. csFileOrPathName += csTail;
  116. return csFileOrPathName;
  117. }
  118. //
  119. // 标准化路径缓冲,如果不是以“”结尾,将自动加上
  120. //
  121. void StandardizationPathBuffer ( LPTSTR szPath, int nSize, TCHAR cFlagChar/*=_T('\')*/ )
  122. {
  123. int nLen = (int)strlen_s(szPath);
  124. if ( nLen < 1 ) return;
  125. ASSERT_ADDRESS ( szPath, nLen+1 );
  126. TCHAR szTemp[4] = {0};
  127. szTemp[0] = cFlagChar;
  128. if ( szPath[nLen-1] != cFlagChar )
  129. strncat_s ( szPath, szTemp, nSize/sizeof(TCHAR) );
  130. CString csPath = StandardizationFileForPathName ( szPath, FALSE );
  131. strncpy_s ( szPath, csPath, nSize );
  132. }
  133. CString StandardizationPathBuffer ( LPTSTR lpszPath, TCHAR cFlagChar/*=_T('\')*/ )
  134. {
  135. TCHAR szPath[MAX_PATH] = {0};
  136. strncpy_s ( szPath, lpszPath, LENGTH(szPath) );
  137. StandardizationPathBuffer ( (LPTSTR)szPath, (int)sizeof(szPath), (TCHAR)cFlagChar );
  138. return szPath;
  139. }
  140. //
  141. //
  142. // 从一个完整的全路径名(包含文件名)中分离出路径(没有文件名)和
  143. // 文件名,如:从“E:0102.exe”中分得“E:01”,结果存入到
  144. // lsOnlyPath中,“002.exe”存入szOnlyFileName中
  145. //
  146. BOOL PartFileAndPathByFullPath (
  147. IN LPCTSTR lpszFilePath, // 全路径名(包含文件名)
  148. OUT TCHAR *szOnlyFileName, // 光文件名(没有路径)
  149. int nFileNameSize,
  150. OUT TCHAR *szOnlyPath /*=NULL*/, // 光路径(没有文件名)
  151. int nPathSize/*=0*/
  152. )
  153. {
  154. ASSERT ( lpszFilePath );
  155. TCHAR chDirPart = _T('\');
  156. if ( strchr_s ( lpszFilePath, _T('/') ) )
  157. chDirPart = _T('/');
  158. if ( szOnlyFileName )
  159. {
  160. memset ( szOnlyFileName, 0, nFileNameSize );
  161. }
  162. if ( szOnlyPath )
  163. {
  164. memset ( szOnlyPath, 0, nPathSize );
  165. }
  166. WIN32_FILE_ATTRIBUTE_DATA FileAttrData;
  167. if ( GetFileAttributesEx ( lpszFilePath, GetFileExInfoStandard, (LPVOID)&FileAttrData ) &&
  168. ( FileAttrData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY
  169. && FileAttrData.dwFileAttributes != 0xffffffff ) // 本身就是目录
  170. {
  171. if ( szOnlyPath )
  172. {
  173. strncpy_s ( szOnlyPath, lpszFilePath, nPathSize/sizeof(TCHAR) );
  174. StandardizationPathBuffer ( szOnlyPath, nPathSize, chDirPart );
  175. }
  176. return TRUE;
  177. }
  178. LPTSTR p = (LPTSTR)strrchr_s ( lpszFilePath, chDirPart );
  179. if ( !p )
  180. {
  181. strncpy_s ( szOnlyFileName, lpszFilePath, nFileNameSize/sizeof(TCHAR) );
  182. return TRUE;
  183. }
  184. if ( szOnlyFileName )
  185. strncpy_s ( szOnlyFileName, p+1, nFileNameSize/sizeof(TCHAR) );
  186. if ( szOnlyPath )
  187. {
  188. strncpy_s ( szOnlyPath, lpszFilePath, nPathSize/sizeof(TCHAR) );
  189. int nLen = (int)(p-lpszFilePath+1);
  190. if ( nPathSize-1 < nLen ) return FALSE;
  191. szOnlyPath [ nLen ] = _T('');
  192. }
  193. return TRUE;
  194. }
  195. /********************************************************************************
  196. * Function Type : Global
  197. * Parameter : lpFileName - 文件路径
  198. * Return Value : -1 - 失败
  199. * >=0 - 文件大小
  200. * Description : 获取文件属性来 ( 文件大小、创建时间 )
  201. *********************************************************************************/
  202. int hwGetFileAttr ( LPCTSTR lpFileName, DWORD *p_dwCreateTime/*=NULL*/ )
  203. {
  204. WIN32_FILE_ATTRIBUTE_DATA FileAttrData;
  205. BOOL bRet = GetFileAttributesEx ( lpFileName,
  206. GetFileExInfoStandard, (LPVOID)&FileAttrData );
  207. if ( !bRet ) return 0;
  208. if ( ( FileAttrData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY ) // 是目录
  209. {
  210. return 0;
  211. }
  212. if ( p_dwCreateTime )
  213. {
  214. CTime t ( FileAttrData.ftCreationTime );
  215. *p_dwCreateTime = (DWORD)t.GetTime();
  216. }
  217. return ( GETFILESIZE ( FileAttrData ) );
  218. }