#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. ml基本问题

    作者:NgShawn 链接:https://www.nowcoder.com/discuss/33737?type=2&order=3&pos=19&page=1 来源:牛客网 ...

  2. spring boot(十二)打包部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...

  3. 关于react16.4——高阶组件(HOC)

    高阶组件是react中用于重用组件逻辑的高级技术.可以说是一种模式.具体来说呢,高阶组件是一个函数,它接收一个组件并返回一个新的组件. 就像这样, const EnhancedComponent = ...

  4. IE的“浏览器模式”和“文档模式的区别”

    1.浏览器模式 用于切换IE针对该网页的默认文档模式.对不同版本浏览器的条件备注解析.发送给网站服务器的用户代理(User_Agent)字符串的值.网站可以根据浏览器返回的不同用户代理字符串判断浏览器 ...

  5. 什么是CSS hack?

    1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的,CSS hack就是让你记住这个标准),以 ...

  6. Session重点整理

    首先明确几个概念 (1)JSessionID:通过tomcat运行的Java项目,为新用户生成的随机字符串.(应该是tomcat设置的,我没试过别的服务器,如有错误请指正) (2)Session请求( ...

  7. MySQL Workbench中如何开启MySQL的远程帐号

    '; /* 上面的语句表示将 discuz 数据库的所有权限授权给 root这个用户,允许 root用户在192.168.119.120进行远程登陆,并设置 root用户的密码为 123456 . 下 ...

  8. 十二、持久层框架(MyBatis)

    一.PageHelper分页插件的使用 PageHelper是一款MyBatis的分页插件,只需要简单的配置,然后直接调用方法就可以. 1.配置PageHelper插件 在mybatis-config ...

  9. Hibernate 加载策略得总结

    Hibernate 加载策略得总结 加载策略(优化查询): 策略种类: 延迟加载: 等到使用的时候才会加载数据. 立即加载: 不管使用不使用,都会立刻将数据加载. 策略的应用: 类级别的加载策略. 关 ...

  10. 【转】js 对象按照键值(不分区大小写)排序,生成签名方法

    客户需求小程序端用js生成签名,我们按照要求一步一步解决,并且将请求方法封装到一个utils.js里: 第一步:对关联数组按照键名做正序排序. 第二步:拼接字符串 第三步:将拼接的字符串加上私钥 第四 ...