#include <windows.h>
#include <stdio.h>
#include <shlwapi.h> #pragma comment(lib,"shlwapi.lib") int myRemoveDirectory(char *szPath)
{
if(!PathIsDirectory(szPath))
{
return GetLastError();
}
BOOL bRes = SetCurrentDirectory(szPath);
if(!bRes)
{
return GetLastError();
}
char * buf =(char *)malloc(MAX_PATH);
ZeroMemory(buf,sizeof(buf)); strcpy(buf,szPath); PathAddBackslash(buf); strcat(buf,"*.*"); WIN32_FIND_DATA findData = {0};
HANDLE hFile = FindFirstFile(buf,&findData);
int nRes = DeleteFile(findData.cFileName);
while(FindNextFile(hFile,&findData))
{
DeleteFile(findData.cFileName);
}
SetCurrentDirectory("D:\\");
FindClose(hFile);
if(!RemoveDirectory(szPath))
{
int nRes = GetLastError();
return nRes;
}
return 0;
} char * MyCreateFile()
{
HANDLE hFile = NULL;
char * cPath = "d:\\temp________111111111111";
if(!myRemoveDirectory(cPath))
{ }
BOOL bRes = CreateDirectory(cPath,NULL);
int nRes = GetLastError();
if(!bRes)
{
MessageBox(NULL,"Failed to create files","Alert",MB_OK);
return NULL;
}
bRes = SetCurrentDirectory(cPath);
char * pszFilePath = (char *)malloc(1024);
strcpy(pszFilePath,cPath);
PathAppend(pszFilePath,"text.txt");
hFile = CreateFile(pszFilePath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == NULL)
{
return NULL;
}
int i,j;
char *buff = (char *)malloc(1024);
char * mallocHeap = buff; // 记录新创建的地址。
if(hFile == INVALID_HANDLE_VALUE)
{
return NULL;
}
DWORD nBytes = 0;
char temp[MAX_PATH]={0};
ZeroMemory(buff,1024);
for(i=1;i<10;i++)
{
for(j=1;j<=i;j++)
{
sprintf(temp,"%d*%d = %d \t",j,i,i*j); //改变temp的指向,temp 不在指向原先的内存地址。
strcat(buff,temp);
}
strcat(buff,"\r\n");
WriteFile(hFile,buff,strlen(buff)+1,&nBytes,NULL);
ZeroMemory(buff,1024);
} CloseHandle(hFile);
free(mallocHeap); return pszFilePath; }
int MyReadFile()
{
char * pszFilePath = MyCreateFile(); HANDLE hFile = CreateFile(pszFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == NULL)
{
return 0;
}
char *buf = (char * )malloc(1024*1024);
char * mallocHeap = buf;
ZeroMemory(buf,sizeof(buf));
DWORD nBytes = 0;
ReadFile(hFile,buf,1024,&nBytes,NULL);
if(nBytes < 1024 )
{
while(nBytes)
{
printf("%s",buf);
int nTemp = strlen(buf);
buf = buf + nTemp +1;
nBytes = nBytes- nTemp-1;
}
}
else
{
while(nBytes)
{ printf("%s",buf);
ZeroMemory(buf,sizeof(buf));
ReadFile(hFile,buf,1024,&nBytes,NULL);
} }
CloseHandle(hFile);
free(mallocHeap);
return 1;
}
int main()
{
if(MyReadFile())
{
MessageBox(NULL,"Success","Success",MB_OK);
}
getchar();
getchar();
return 0;
}

  


总结:
 
free 只能释放malloc alloc 创建的堆指针,改变无效。
findfirstfile 实在一对文件中寻找文件,而不是在一个文件夹里寻找文件。
也就是说 findfirstfile(d:\\*.*) 是可以找到目录下面的文件的。
大师 findfirstfile(d:\\) 不行。
wirtefile 当第四个参数为null的时候 第三个参数不允许为null

一次练习 发现的问题,malloc free 无效;findfirstfile失败,writefile失败的原因的更多相关文章

  1. 早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)

    今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return f ...

  2. malloc实现原理

    记得早一段时间,看到一本书上写过delete的一个..今天突然找啦一下资料: malloc()是C语言中动态存储管理 的一组标准库函数之中的一个.其作用是在内存的动态存储区中分配一个长度为size的连 ...

  3. 最小重组缓冲区和路径MTU发现

    概括: 主要来源于unp,可参考:http://blog.csdn.net/ysu108/article/details/7764461 疑惑: 1. 最小重组缓冲区大小: ipv4为576,ipv6 ...

  4. malloc函数分配内存失败的常见原因

    malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存 ...

  5. C++异常处理

    引言 异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常,希望它的调用者可以直接或者间接处理这个问题.而传统错误处理技术,检查到一个局部无法处理的问题时: 1.终止程序(例如atol,atoi ...

  6. Linux Programe/Dynamic Shared Library Entry/Exit Point && Glibc Entry Point/Function

    目录 . 引言 . C/C++运行库 . 静态Glibc && 可执行文件 入口/终止函数 . 动态Glibc && 可执行文件 入口/终止函数 . 静态Glibc & ...

  7. C输入输出函数与缓冲区

    #转 对C语言输入输出流和缓冲区的深入理解C语言缓冲区(缓存)详解缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的 ...

  8. Java编程思想读书笔记

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. CPPUTest 单元测试框架(针对 C 单元测试的使用说明)

    CPPUTest 虽然名称上看起来是 C++ 的单元测试框架, 其实它也是支持测试 C 代码的. 本文主要介绍用CPPUTest来测试 C 代码. (C++没用过, 平时主要用的是C) C++相关的内 ...

随机推荐

  1. 使用validate()方法进行输入校验 --Struts2框架

    服务器端的输入校验包含两种方式:硬编码方式和配置文件方式.本文演示硬编码方式中使用validate()方法进行输入校验. 1.项目目录结构: 2.项目核心代码: BookAction.java: pu ...

  2. Linux中符号总结

    常用符号~   登陆用户当前的家目录 .   当前目录..   当前目录的上一级目录cd -   返回上一次的目录;   命令分隔符#   表示注释 ?   通配符中表示任意一个字符*   通配符中表 ...

  3. 使用Vue cli3搭建一个用Fetch Api的组件

    系列参考 ,英文原文参考 我的git代码: https://github.com/chentianwei411/Typeahead 目标: 建立一个输入关键字得到相关列表的组件,用Vuejs2和Fet ...

  4. 以太坊 web3.js 文档翻译及说明

    这些天,为了录制以太坊DAPP开发实战课程,我准备把web3文档全部翻译一下(并做适当的补充),目前web3.js 0.20.x 版本 已经翻译完成,欢迎大家前往查阅. 这里还几个实用DEMO,供大家 ...

  5. Spring Batch JSON 支持

    Spring Batch 4.1 开始能够支持 JSON 格式了.这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [   {     &q ...

  6. Spring Batch 体系结构

    Spring Batch 设计的时候充分考虑了可扩展性和各类终端用户. 下图显示了 Spring Batch 的架构层次示意图,这种架构层次为终端用户开发者提供了很好的扩展性与易用性. 上图显示的是 ...

  7. 将本地 项目文件托管到 github

    1.新建一个本地 repository文件夹 2.将想要 托管的项目或文件 复制到repository 文件夹下 2. 右键 git bash here 输入命令 git init 生成本地仓库 4. ...

  8. DOM与document的区别

    DOM: DOM 全称是 Document Object Model,也就是文档对象模型. DOM 就是针对 HTML 和 XML 提供的一个API.什么意思?就是说为了能以编程的方法操作这个 HTM ...

  9. array 数组去重 过滤空值等方法

    去重操作 第一种方式, ES 6 引入的新书据结构 Set 本身就是没有重复数据的, 可以使用这个数据结构来转化数组.时间复杂度 O(n) 123456 const target = [];const ...

  10. [contest 782] 9.7

    [contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送