KFile.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KFile.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: Win32 File Operation Class
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KFilePath.h"
  11. #include "KFile.h"
  12. #ifndef WIN32
  13. #include "zport.h"
  14. #endif
  15. //---------------------------------------------------------------------------
  16. // 函数: KFile
  17. // 功能: 购造函数
  18. // 参数: void
  19. // 返回: void
  20. //---------------------------------------------------------------------------
  21. KFile::KFile()
  22. {
  23. m_hFile = NULL;
  24. m_dwLen = 0;
  25. m_dwPos = 0;
  26. }
  27. //---------------------------------------------------------------------------
  28. // 函数: ~KFile
  29. // 功能: 析造函数
  30. // 参数: void
  31. // 返回: void
  32. //---------------------------------------------------------------------------
  33. KFile::~KFile()
  34. {
  35. Close();
  36. }
  37. //---------------------------------------------------------------------------
  38. // 函数: Open
  39. // 功能: 打开一个文件,准备读取
  40. // 参数: FileName 文件名
  41. // 返回: 成功返回TRUE,失败返回FALSE。
  42. //---------------------------------------------------------------------------
  43. BOOL KFile::Open(LPSTR FileName)
  44. {
  45. char PathName[MAXPATH];
  46. // close prior file handle
  47. //if (m_hFile != INVALID_HANDLE_VALUE)
  48. // Close();
  49. if (m_hFile != NULL)
  50. Close();
  51. // get full path name
  52. g_GetFullPath(PathName, FileName);
  53. /*#ifndef WIN32
  54. char *name_ptr = PathName;
  55. while(*name_ptr) {
  56. if(*name_ptr == '\') *name_ptr = '/';
  57. name_ptr++;
  58. }
  59. #endif
  60. // Open the file for read
  61. m_hFile = CreateFile(
  62. PathName, // pointer to name of the file with path
  63. GENERIC_READ, // access (read-write) mode
  64. FILE_SHARE_READ,// share mode
  65. NULL, // pointer to security attributes
  66. OPEN_EXISTING, // how to create
  67. FILE_ATTRIBUTE_NORMAL,// file attributes
  68. NULL); // template file*/
  69. #ifndef WIN32
  70.         char *ptr = PathName;
  71.         while(*ptr) {
  72.           if(*ptr == '\') *ptr = '/';
  73.           ptr++;
  74.         }
  75. //open lower case file for linux
  76. char lcasePathName[MAXPATH];
  77. char szRootPath[MAXPATH];
  78. g_GetRootPath(szRootPath);
  79. strcpy(lcasePathName, PathName);
  80. if (memcmp(lcasePathName, szRootPath, strlen(szRootPath)) == 0)
  81. strlwr(lcasePathName + strlen(szRootPath));
  82. else
  83. strlwr(lcasePathName);
  84. if (NULL == (m_hFile = fopen(lcasePathName, "rb")))
  85. #endif
  86. m_hFile = fopen(PathName, "rb");
  87. // check file handle
  88. //if (m_hFile == INVALID_HANDLE_VALUE)
  89. // return FALSE;
  90. if (m_hFile == NULL)
  91. {
  92. return FALSE;
  93. }
  94. return TRUE;
  95. }
  96. //---------------------------------------------------------------------------
  97. // 函数: Create
  98. // 功能: 创建一个文件,准备写入。
  99. // 参数: FileName 文件名
  100. // 返回: 成功返回TRUE,失败返回FALSE。
  101. //---------------------------------------------------------------------------
  102. BOOL KFile::Create(LPSTR FileName)
  103. {
  104. char PathName[MAXPATH];
  105. // close prior file handle
  106. //if (m_hFile != INVALID_HANDLE_VALUE)
  107. // Close();
  108. if (m_hFile != NULL)
  109. Close();
  110. // get full path name
  111. g_GetFullPath(PathName, FileName);
  112. // change file attribute for write
  113. // SetFileAttributes(PathName, FILE_ATTRIBUTE_NORMAL);
  114. // create file for write
  115. /* m_hFile = CreateFile(
  116. PathName, // pointer to name of the file with path
  117. GENERIC_WRITE, // access (read-write) mode
  118. FILE_SHARE_READ,// share mode
  119. NULL, // pointer to security attributes
  120. CREATE_ALWAYS, // create or over write
  121. FILE_ATTRIBUTE_NORMAL, // file attributes
  122. NULL); // template file
  123. */
  124. m_hFile = fopen(PathName, "wb+");
  125. // check file handle
  126. //if (m_hFile == INVALID_HANDLE_VALUE)
  127. // return FALSE;
  128. if (m_hFile == NULL)
  129. return FALSE;
  130. return TRUE;
  131. }
  132. //---------------------------------------------------------------------------
  133. // 函数: Append
  134. // 功能: 打开一个文件,准备在后部添加数据,如果此文件不存在,则产生这个文件。
  135. // 参数: FileName 文件名
  136. // 返回: 成功返回TRUE,失败返回FALSE。
  137. //---------------------------------------------------------------------------
  138. BOOL KFile::Append(LPSTR FileName)
  139. {
  140. char PathName[MAXPATH];
  141. // close prior file handle
  142. //if (m_hFile != INVALID_HANDLE_VALUE)
  143. // Close();
  144. if (m_hFile != NULL)
  145. Close();
  146. // get full path name
  147. g_GetFullPath(PathName, FileName);
  148. // change file attribute for write
  149. // SetFileAttributes(PathName, FILE_ATTRIBUTE_NORMAL);
  150. // create file for write
  151. /* m_hFile = CreateFile(
  152. PathName, // pointer to name of the file with path
  153. GENERIC_WRITE, // access (read-write) mode
  154. FILE_SHARE_READ,// share mode
  155. NULL, // pointer to security attributes
  156. OPEN_ALWAYS, // Opens the file, if it exists. If the file does not exist, the function creates the file as if dwCreationDisposition were CREATE_NEW
  157. FILE_ATTRIBUTE_NORMAL, // file attributes
  158. NULL); // template file*/
  159. //if (m_hFile == INVALID_HANDLE_VALUE)
  160. // return FALSE;
  161. // check file handle
  162. m_hFile = fopen(PathName, "ab");
  163. if (m_hFile == NULL)
  164. return FALSE;
  165. Seek(0, FILE_END);
  166. return TRUE;
  167. }
  168. //---------------------------------------------------------------------------
  169. // 函数: Close
  170. // 功能: 关闭打开的文件
  171. // 参数: void
  172. // 返回: void
  173. //---------------------------------------------------------------------------
  174. void KFile::Close()
  175. {
  176. //if (m_hFile != INVALID_HANDLE_VALUE)
  177. //CloseHandle(m_hFile);
  178. if (m_hFile)
  179. fclose((FILE*)m_hFile);
  180. //m_hFile = (FILE *)INVALID_HANDLE_VALUE;
  181. m_hFile = NULL;
  182. m_dwLen = 0;
  183. m_dwPos = 0;
  184. }
  185. //---------------------------------------------------------------------------
  186. // 函数: Read
  187. // 功能: 读取文件数据
  188. // 参数: lpBuffer 读取数据存放的内存区域
  189. // dwReadBytes 读取数据的字节数
  190. // 返回: 成功返回读取的字节数,失败返回0。
  191. //---------------------------------------------------------------------------
  192. DWORD KFile::Read(LPVOID lpBuffer, DWORD dwReadBytes)
  193. {
  194. DWORD dwBytesRead;
  195. //if (m_hFile == INVALID_HANDLE_VALUE)
  196. // return 0;
  197. if (m_hFile == NULL)
  198. return 0;
  199. // ReadFile(m_hFile, lpBuffer, dwReadBytes, &dwBytesRead, NULL);
  200. dwBytesRead = fread(lpBuffer, 1, dwReadBytes, m_hFile);
  201. m_dwPos += dwBytesRead;
  202. return dwBytesRead;
  203. }
  204. //---------------------------------------------------------------------------
  205. // 函数: write
  206. // 功能: 写入文件数据
  207. // 参数: lpBuffer 写入数据存放的内存区域
  208. // dwWriteBytes 写入数据的字节数
  209. // 返回: 成功返回写入的字节数,失败返回0。
  210. //---------------------------------------------------------------------------
  211. DWORD KFile::Write(LPVOID lpBuffer, DWORD dwWriteBytes)
  212. {
  213. DWORD dwBytesWrite;
  214. //if (m_hFile == INVALID_HANDLE_VALUE)
  215. // return 0;
  216. if (m_hFile == NULL)
  217. return 0;
  218. dwBytesWrite = fwrite(lpBuffer, 1, dwWriteBytes, m_hFile);
  219. // WriteFile(m_hFile, lpBuffer, dwWriteBytes, &dwBytesWrite, NULL);
  220. m_dwPos += dwBytesWrite;
  221. return dwBytesWrite;
  222. }
  223. //---------------------------------------------------------------------------
  224. // 函数: Seek
  225. // 功能: 移动文件指针位置
  226. // 参数: lDistance 移动长度
  227. // dwMoveMethod 移动方法=FILE_BEGIN,FILE_CURRENT,FILE_END
  228. // 返回: 成功返回指针位置,失败返回SEEK_ERROR。
  229. //---------------------------------------------------------------------------
  230. DWORD KFile::Seek(LONG lDistance, DWORD dwMoveMethod)
  231. {
  232. //if (m_hFile == INVALID_HANDLE_VALUE)
  233. // return SEEK_ERROR;
  234. if (m_hFile == NULL)
  235. return SEEK_ERROR;
  236. // m_dwPos = SetFilePointer(m_hFile, lDistance, NULL, dwMoveMethod);
  237. fseek(m_hFile, lDistance, dwMoveMethod);
  238. m_dwPos = ftell(m_hFile);
  239. return m_dwPos;
  240. }
  241. //---------------------------------------------------------------------------
  242. // 函数: Tell
  243. // 功能: 取得文件指针位置
  244. // 参数: void
  245. // 返回: 成功返回指针位置,失败返回SEEK_ERROR。
  246. //---------------------------------------------------------------------------
  247. DWORD KFile::Tell()
  248. {
  249. //if (m_hFile == INVALID_HANDLE_VALUE)
  250. // return SEEK_ERROR;
  251. if (m_hFile == NULL)
  252. return SEEK_ERROR;
  253. return m_dwPos;
  254. }
  255. //---------------------------------------------------------------------------
  256. // 函数: Size
  257. // 功能: 取得文件长度
  258. // 参数: void
  259. // 返回: 成功返回文件长度,失败返回0。
  260. //---------------------------------------------------------------------------
  261. DWORD KFile::Size()
  262. {
  263. //if (m_hFile == INVALID_HANDLE_VALUE)
  264. // return 0;
  265. if (m_hFile == NULL)
  266. return 0;
  267. if (m_dwLen == 0) {
  268. DWORD temp = m_dwPos;
  269. m_dwLen = Seek(0, FILE_END);
  270. Seek(temp, FILE_BEGIN);
  271. //m_dwLen = GetFileSize(m_hFile, NULL);
  272. }
  273. return m_dwLen;
  274. }
  275. //---------------------------------------------------------------------------