保存文本文件的一个问题CreateFile()

dreamerwhy 2003-11-26 12:44:10
文本文件保存时,如果再已有的文本文件基础上,修改了后保存到原来的文本文件
那么CreateFile()的时候用CREATE_ALWAYS 还是 OPEN_EXISTING 呢?
我觉得应该用OPEN_EXISTING ,但是用了后面的,结果用自己的程序可以修改文件,并且保存,再次打开也可以,但是用windows的记事本打开这个修改后的文件后,发现在后面已经刚才修改的时候删掉的文本(本来有文本的,修改后面的文本,就是删掉后面的文本) 仍然可以看到,而且有部分是乱码了,我估计是原来的存储空间没有释放原来的信息,,但是按理说记事本也应该看不到了的呀,
我用自己编的一切都正常的,修改了后面就没有了的,怎么回事呢?难道是原理不同两者?

当然我也用CREATE_ALWAYS 试过的,这个当然可以,因为是新建了个文件啊,重新申请了存储空间的吧,应该,但是我想这样原来的空间不是没有释放吗?那应该如何释放呢?
很期待各位指点,谢谢,!!!!
...全文
214 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamerwhy 2003-11-27
  • 打赏
  • 举报
回复
我只是个处学者,很多地方不懂,也不明确,希望各位指教 呵呵!
dreamerwhy 2003-11-26
  • 打赏
  • 举报
回复
flyidd(火舞者)提供的是和我的类似的,
问题就是在这里PopFileWrite()函数里的CreateFile()函数
if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, 0, NULL)))

一定要用CREATE_ALWAYS参数吗?要是文件本来就存在,我们只是修改一下文件的内容那用CREATE_ALWAYS参数是不是浪费空间呢?
于是我换了个OPEN_EXISTING参数,但是问题就出来了,修改后 删掉的字符用这个程序打开一切正常啊,但是就是用 记事本打开 就仍然存在啊,怎么办?当然用CREATE_ALWAYS参数是没问题的.我就是觉得太浪费空间了!你们说呢?是不是记事本处理字符的结束标志和我们这个程序的处理结束标志不同呢?我只是个处学者,很多地方不懂,也不明确,希望各位指教 呵呵!
flyidd 2003-11-26
  • 打赏
  • 举报
回复
BOOL PopFileRead (HWND hwndEdit, PTSTR pstrFileName)
{
BYTE bySwap ;
DWORD dwBytesRead ;
HANDLE hFile ;
int i, iFileLength, iUniTest ;
PBYTE pBuffer, pText, pConv ;

// Open the file.

if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL)))
return FALSE ;

// Get file size in bytes and allocate memory for read.
// Add an extra two bytes for zero termination.

iFileLength = GetFileSize (hFile, NULL) ;
pBuffer = malloc (iFileLength + 2) ;

// Read file and put terminating zeros at end.

ReadFile (hFile, pBuffer, iFileLength, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
pBuffer[iFileLength] = '\0' ;
pBuffer[iFileLength + 1] = '\0' ;

// Test to see if the text is Unicode

iUniTest = IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE ;

if (IsTextUnicode (pBuffer, iFileLength, &iUniTest))
{
pText = pBuffer + 2 ;
iFileLength -= 2 ;

if (iUniTest & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
{
for (i = 0 ; i < iFileLength / 2 ; i++)
{
bySwap = ((BYTE *) pText) [2 * i] ;
((BYTE *) pText) [2 * i] = ((BYTE *) pText) [2 * i + 1] ;
((BYTE *) pText) [2 * i + 1] = bySwap ;
}
}

// Allocate memory for possibly converted string

pConv = malloc (iFileLength + 2) ;

// If the edit control is not Unicode, convert Unicode text to
// non-Unicode (ie, in general, wide character).

#ifndef UNICODE
WideCharToMultiByte (CP_ACP, 0, (PWSTR) pText, -1, pConv,
iFileLength + 2, NULL, NULL) ;

// If the edit control is Unicode, just copy the string
#else
lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
#endif

}
else // the file is not Unicode
{
pText = pBuffer ;

// Allocate memory for possibly converted string.

pConv = malloc (2 * iFileLength + 2) ;

// If the edit control is Unicode, convert ASCII text.

#ifdef UNICODE
MultiByteToWideChar (CP_ACP, 0, pText, -1, (PTSTR) pConv,
iFileLength + 1) ;

// If not, just copy buffer
#else
lstrcpy ((PTSTR) pConv, (PTSTR) pText) ;
#endif
}

SetWindowText (hwndEdit, (PTSTR) pConv) ;
free (pBuffer) ;
free (pConv) ;

return TRUE ;
}

BOOL PopFileWrite (HWND hwndEdit, PTSTR pstrFileName)
{
DWORD dwBytesWritten ;
HANDLE hFile ;
int iLength ;
PTSTR pstrBuffer ;
WORD wByteOrderMark = 0xFEFF ;

// Open the file, creating it if necessary

if (INVALID_HANDLE_VALUE ==
(hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, 0, NULL)))
return FALSE ;

// Get the number of characters in the edit control and allocate
// memory for them.

iLength = GetWindowTextLength (hwndEdit) ;
pstrBuffer = (PTSTR) malloc ((iLength + 1) * sizeof (TCHAR)) ;

if (!pstrBuffer)
{
CloseHandle (hFile) ;
return FALSE ;
}

// If the edit control will return Unicode text, write the
// byte order mark to the file.

#ifdef UNICODE
WriteFile (hFile, &wByteOrderMark, 2, &dwBytesWritten, NULL) ;
#endif

// Get the edit buffer and write that out to the file.

GetWindowText (hwndEdit, pstrBuffer, iLength + 1) ;
WriteFile (hFile, pstrBuffer, iLength * sizeof (TCHAR),
&dwBytesWritten, NULL) ;

if ((iLength * sizeof (TCHAR)) != (int) dwBytesWritten)
{
CloseHandle (hFile) ;
free (pstrBuffer) ;
return FALSE ;
}

CloseHandle (hFile) ;
free (pstrBuffer) ;

return TRUE ;
}
dreamerwhy 2003-11-26
  • 打赏
  • 举报
回复
RE:
“回复人: houwenqiang() ( ) 信誉:100 2003-11-26 17:36:00 得分:0
用OPEN_EXISTING,修改完成后重新设置文件长度”

我是用OPEN_EXISTING的,但是 如果把这个文件 用 系统自带的 记事本 打开 就会发现以前的字符还有存在,好像刚才删掉的 字符 还在的,但是用自己编的那个程序再打开就没这个问题,我不知道是怎么一回事》???
houwenqiang 2003-11-26
  • 打赏
  • 举报
回复
用OPEN_EXISTING,修改完成后重新设置文件长度
dreamerwhy 2003-11-26
  • 打赏
  • 举报
回复
求救呀 求救呀!!!!大家都帮帮忙呀!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧