精华内容
下载资源
问答
  • 网上大部分资源都是分散的,我给大家总结了一下。包括vc6.0纯净版的安装包,vc6.0的编程助手VA(VA的功能你们懂得),vc6.0工程“添加文件出错的解决方案及其对应工具filetool.exe。
  • VC6.0读取Excel文件数据

    千次阅读 2018-10-11 17:39:02
    文件存储在Excel文件中,因此第一步是能够在程序方便地读取表格数据,这里用的是VC6.0 MFC。文章内容仅供参考,程序不完整。 完整的VC6.0相关程序,需要的可以下载:...

    VC6.0读取Excel文件数据

    文件存储在Excel文件中,因此第一步是能够在程序中方便地读取表格数据,这里用的是VC6.0 MFC。文章内容仅供参考,程序不完整。

    完整的VC6.0相关程序,需要的可以下载:https://download.csdn.net/download/qq_31569581/10714285


    1、电脑上安装VC6.0,Excel2007,其他Office版本亦可(WPS尽量避免);

    2、建立一个MFC基于对话框的应用程序工程,名称自己定,这里取名为"Solar",添加一个按钮、一个列表控件,分别取名为"Model2","List1",并为后者添加成员变量"m_ExcelData"。(对于新手如我,列表成员变量如下图)

     

    3、在程序入口处CXXXApp:: InitInstance()函数AfxEnableControlContainer();语句之后加入下面几行:

    if (CoInitialize(NULL) != 0)
    {
           AfxMessageBox(“初始化COM支持库失败!”);
           exit(1);
    }

    假如这个条件不通过就不能运行起程序。在程序的出口处CSolarApp:: ExitInstance()函数return语句之前加入下面这句话:

    CoUninitialize();

    来释放COM支持库,这样对COM库的支持就已完成。

    4、下面要从Office的安装目录中找到对VC操作excel文件的动态库,在某些版本下这个文件是Excel8.olb或Excel9.olb,在我的版本中是excel.exe这个exe也是动态库的形式,是微软公司主要的文件结果之一。选择VC的View(查看)菜单里面的类向导ClassWizad命令,会弹出一个对话框;然后点击Add Class…按钮选择From a type library,会弹出一个打开对话框,从这里打开Office安装目录下D:\Program Files\Microsoft Office\Office16\EXCEL.EXE文件,(具体目录视office版本而定)从里面选择几个要用到的类:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,点击OK按钮(不要重复导入,一次性control全选即可)。会在程序中生成一个excel.h和excel.cpp文件,这些文件中包含了刚才我们选择的几个类的代码。下面介绍一下这几个类:

     

     

      在VC操纵excel的exe动态库里面有好多个对象模型,就是刚才在创建过程中看到的那个列表,但是经常用到的有这么几个:_Application, Workbooks, _Wrokbook, Worksheets, _WorkSheet, Range,Charts和_Chart,最后面的两个是用来操作图表的,这里没有用到所以这里也就不记录了。

      5、准备工作做好之后,接下来开始实现按钮功能:按下之后读取Excel表格数据,并显示在列表控件中。这里只是进行简单地显示,没有给出具体的处理过程及结果图像。(这只是部分实例)

     在头文件"afxstd.h"中添加以下几个头文件(有些电脑环境可能不必全部加),注意别重复添加某些头文件。

    #include <comdef.h>
    #include <comutil.h>
    #include <OAIDL.H>
    #include <afxdisp.h>
    #include "excel.h"

     若编译报重定义错误,解决方法是在"excel.h"头文件中的头部添加

    #if !defined _HEAD_FILE_EXCEL9_ 
    #define _HEAD_FILE_EXCEL9_

       在其尾部添加:

    #endif

     在对话框初始化函数BOOL CSolarDlg::OnInitDialog()中添加列表控件风格设置语句:

    m_Exceldata.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

    OK,在函数BOOL CSolarDlg::OnModel2()中添加数据读取及显示代码:

           _Application m_oExcelApp;
           Workbooks m_oWorkSheets;
           _Worksheet m_oWorkSheet;
           Workbooks m_oWorkBooks;
           _Workbook m_oWorkBook;
           Range m_oCurrRange;
           if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) ) 
           {
               ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK | MB_ICONERROR); 
              exit(1); 
          }
      
          //设置为显示
          m_oExcelApp.SetVisible(FALSE);
          m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。
      
          LPDISPATCH  lpDisp = NULL;
          COleVariant covTrue((short)TRUE);
          COleVariant covFalse((short)FALSE);
          COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
          Range       oCurCell;
      
          CString FilePathName;
          CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框
          if(dlg.DoModal() == IDOK)
          {
              FilePathName = dlg.GetPathName();
              /*
              (1)GetPathName();取文件名全称,包括完整路径。取回C:\\WINDOWS\\TEST.EXE
              (2)GetFileTitle();取回TEST
              (3)GetFileName();取文件全名:TEST.EXE
              (4)GetFileExt();取扩展名EXE
              */
    		  //AfxMessageBox("Open file!.");
          }
          else
          {
              AfxMessageBox("Open file opetation has been canceled.");
              return;
          }
          
          // 打开文件
          lpDisp = m_oWorkBooks.Open( FilePathName, 
                                    _variant_t(vtMissing), 
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing),
                                    _variant_t(vtMissing) );
          // 获得活动的WorkBook( 工作簿 )
          m_oWorkBook.AttachDispatch( lpDisp, TRUE );
          // 获得活动的WorkSheet( 工作表 )
          m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
          // 获得使用的区域Range( 区域 )
          m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
      
          // 获得使用的行数
          long lgUsedRowNum = 0;
          m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
          lgUsedRowNum = m_oCurrRange.GetCount();
          // 获得使用的列数
          long lgUsedColumnNum = 0;
          m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
          lgUsedColumnNum = m_oCurrRange.GetCount();
          // 读取Sheet的名称
          CString strSheetName = m_oWorkSheet.GetName();
      
          //得到全部Cells,此时,CurrRange是cells的集合 
          m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE ); 
       //AfxMessageBox("Open file!.");
          // 更新列表控件数据
          for ( int j = 0; j < lgUsedColumnNum; ++j)
          {
    		  
              if(j == 9)
              {
                  m_ExcelData.InsertColumn(j,"Index",LVCFMT_CENTER);
                  m_ExcelData.SetColumnWidth(j,40);
                  continue;
              }
    		  //AfxMessageBox("Open file!.");
             oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(0 + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
    		 
              VARIANT varItemName = oCurCell.GetText();
            strItemName = varItemName.bstrVal;
              m_ExcelData.InsertColumn(j,strItemName,LVCFMT_CENTER);
              m_ExcelData.SetColumnWidth(j,80);
    		  
          }
    
          for ( int i = 1; i < lgUsedRowNum; ++i) //标题栏0+1行已经取出,从1+1开始获取数据到29+1
          {
              strItemName.Format("%d",i);
              m_ExcelData.InsertItem(i-1,strItemName);
              m_ExcelData.SetItemText(i-1,0,strItemName);
              for ( int j = 1; j < lgUsedColumnNum; ++j) //1-8
             {
                 oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
                 VARIANT varItemName = oCurCell.GetText();
                 strItemName = varItemName.bstrVal;
     
                 // 判断是否是合并的单元格
                 VARIANT varMerge = oCurCell.GetMergeCells();
                 if ( varMerge.boolVal == -1 )
                 {
                      AfxMessageBox( _T( "是合并的单元格!" ) );
                 }
                 else if ( varMerge.boolVal == 0 )
                 {
                      AfxMessageBox( _T( "不是合并的单元格!" ) );
                 }
                 
                 m_ExcelData.SetItemText(i-1,j,strItemName);
             }
         }
     
         // 关闭
         m_oWorkBook.Close( covOptional, COleVariant( FilePathName ), covOptional );
         m_oWorkBooks.Close();
         // 释放
         m_oCurrRange.ReleaseDispatch();
         m_oWorkSheet.ReleaseDispatch();
         m_oWorkSheets.ReleaseDispatch();
         m_oWorkBook.ReleaseDispatch();
         m_oWorkBooks.ReleaseDispatch();
         m_oExcelApp.ReleaseDispatch();
         m_oExcelApp.Quit();    // 这条语句是推出Excel程序,任务管理器中的EXCEL进程会自动结束

     代码中字符串变量strItemName是全局变量,在文件开头声明:

    CString strItemName = " ";

    须注意的是:

    • 代码中79-92行是为列表添加属性列及名称,第一个属性序号("Index")是人为命名并添加,不是必须的;从第二个属性列开始为表格属性;
    • 代码中23-39行是文件打开过程,选择Excel文件后,下面代码会根据完整文件名进行数据读取;
    • 在VC数组及列表控件中,下标从0开始,而读取Excel表格数据时,索引从1开始。

     

    展开全文
  • VC6.0dll文件的创建和使用

    千次阅读 2013-07-20 22:54:53
    1.创建一个dll文件vc6.0 2.往工程中加入CPP文件,内容如下: 其中的_declspec(dllexport)表示将这个dll文件中的这个方法导出,只有dll文件中的方法或者类被导出了才能被外部调用 3.编译这个dll文件会在这个...

    1.创建一个dll文件在vc6.0中


    2.往工程中加入CPP文件,内容如下:

    其中的_declspec(dllexport)表示将这个dll文件中的这个方法导出,只有dll文件中的方法或者类被导出了才能被外部调用


    3.编译这个dll文件会在这个工程目录下的debug目录中出现三个文件,一个lib文件,一个dll文件和一个exp文件,exp文件可以不管他。lib文件存储的是dll文件中方法的入口地址索引等信息,真正的方法实现代码在dll文件中


    4.如何使用dll文件。新建一个MFC基于对话框的工程test,在其上添加两个按钮add和subtract分别在这两个按钮上添加单击响应事件调用dll文件中的add和subtract方法


    红框中表示声明dll文件中的方法


    5.此时编译会出现错误,我们需要将上面的生成的dll文件和lib文件拷贝到test工程目录下(因为工程搜索dll文件路径是本工程中的debug目录中,当前工程目录中,然后是C盘中system32目录中)。然后选择 工程->设置->连接 在 对象/模板库 处添加 DLL.lib,注意如果有多个lib文件,在这里使用空格分隔而不是使用“/”,在编译就可以通过了。


    6.有时不仅有dll文件和lib文件而且还有h文件,在h文件中其实起到的作用是声明哪些方法被导出可在dll文件外部可用。所以在使用的时候只需包含头文件,就起到了步骤4中图2红框中的作用,实际上在头文件中有这种语句

     

     

     

    如果有若干个dll文件以及相对应的lib文件(也可能会有头文件),那么可以这样使用

    1.将这些dll文件都拷贝到C盘中system32目录下(也可以拷贝到工程目录下,个人觉的还是拷贝到工程目录下,因为在发布软件的时候这些用到的dll文件需要一同发布)

    2.将所有的h文件拷贝到VC98中的include目录下

    3.将所有的lib文件拷贝到VC98中的lib目录下(在project->add to project->file中添加在VC98目录下的需要用到的lib文件)

    4.写一个新的工程时,只需包含相应的头文件,就可以使用dll中的函数了

    注意:个人强烈建议还是将dll文件和lib文件都放在自己创建的工程目下,在project->add to project->file中添加工程目录下的lib文件,否则不注意肯能会出现意想不到的问题,我就在这上面吃过大亏,出现0xc0000005的地址错误,却怎么都找不出是哪里的原因。

     

     

    关于dll文件的头文件的写法

    1.h文件

    2.cpp文件

     3.这样在客户端使用dll文件中的函数的时候只需包含头文件即可,不需要使用_declspec(dllimport).

    展开全文
  • VC编译错误处理

    2019-01-16 16:07:49
    VC编译错误处理 1. 使用VC2008调试时弹出没有找到mfc90ud.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此 方法: 项目属性-&gt;配置属性-&gt;链接器-&gt;调试-&gt;生成映射文件 选择 ...

    VC编译错误处理

    1. 使用VC2008调试时弹出没有找到mfc90ud.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此
    方法: 项目属性->配置属性->链接器->调试->生成映射文件 选择 Yes (/MAP)

    2. error C2471: 无法更新程序数据库“d:\Work\ Project\FBReader\debug\vc90.pdb”
    解决方案:修改项目属性 右击项目 --> "属性”

    1. “C/C++” --> "常规” -->”调试信息格式” 设置为 “C7 兼容(/Z7)”
    2. “C/C++” --> "代码生成” -->”启用字符串池” 设置为 “是(/GF)”
    3. “链接器” --> "调试” -->”生成调试信息” 设置为 “是(/DEBUG)”

    3. error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup
    Go to “Linker settings -> System”. Change the field “Subsystem” from “Windows” to “Console”. Done.

    4. CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409【错误解决方法】
    描述:Visual Studio 2003.NET转化为2005时所遇到的错误使得无法运行。
    解决:找到解决方案下的rc文件,用记事本打开,注释掉含有manifest所在行,重新编译即可。
    如://1 RT_MANIFEST “SimpleSample.manifest”

    5. 错误提示:XML 分析: 行 1,字符 38,无法切换编码 .
    需要把xml存入数据库,在数据库中建立了xml类型的列后,使用程序将xml作为参数存入库时,出现了错误:XML 分析: 行 1,字符 38,无法切换编码。经过网上查找资料,找到解决方案:将<?xml version="1.0" encoding="utf-8"?>去掉后即可插入
    直接删掉第一行

    6. error LNK2026: module unsafe for SAFESEH image.
    Linker->Advanced->Image has safe exception handlers:改为No(/SAFESEH:NO)

    7. 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用(转)
    LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib test

    参考了以下方法

    以下为转载

    一,问题描述
    error LNK2001: unresolved external symbol _WinMain@16
    debug/main.exe:fatal error LNK 1120:1 unresolved externals
    error executing link.exe;

    二,产生这个问题可能的原因
    1, 你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain.
    2. 你用vc打开了一个.c/.cpp 文件,然后直接编译这个文件,这个文件中使用了WinMian而不是main作为入口函数。vc这时的默认设置是针对控制台程序的。

    三, 解决方法
    1.进入project->setting->c/c++, 在category中选择preprocessor,在processor definitions中删除_CONSOLE, 添加_WINDOWS
    2.进入project->setting->Link, 在Project options中将 /subsystem:console改为/subsystem:windows.
    3.保存设置,Rebuild All.

    VS2005中的设置请参考对应项进行设置

    四,VS2005中的设置

    1.菜单中选择 Project->Properties, 弹出Property Pages窗口
    2.在左边栏中依次选择:Configuration Properties->C/C+±>Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.
    3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)
    4.Rebuild All. Ok ?

    8. error C3389:__declspec(dllexport) 不能与 /clr:pure 或 /clr:safe 一起使用
      解决方法:
      1、菜单“项目”–〉“XXXX属性”
      2、“配置属性”–〉“常规”—〉“公共语言运行库支持”
      3、系统默认“纯 MSIL 公共语言运行库支持(/clr:pure)”改为“公共语言运行库支持(/clr)”或“公共语言运行库支持,原来的语法 (/clr:oldSyntax)”选项即可

    9. 使用vs2008编译c文件时,可能遇到出现 inline”之后应输入“(”错误!
    解决方案是:在该头文件中加入
    #if defined(WIN32) && !defined(__cplusplus)
    #define inline __inline
    #endif

    10. This function or variable may be unsafe
    在该文件上右击,在 processor 中添加 _CRT_SECURE_NO_WARNINGS

    11. Building an MFC project for a non-Unicode character set is deprecated
    下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=40770

    12. error C2054: expected ‘(’ to follow 'inline’
    不用改代码,直接改project->[setting]->[c/c++]->Preprocessor definitions:编辑框里输入inline=__inline即可。

    13. LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    错误描述:
    1>正在编译资源…
    1>正在编译资源清单…
    1>正在链接…
    1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    1>生成日志保存在“file://E:\HelloC\ShapeFill V11\ShapeFill\Debug\ShapeFill.log”
    1>ShapeFill- 1个错误,0个警告
    ========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过 ==========

    解决方案:
    第一步:将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”。若还不能解决问题进入第二步。
    第二步:查看计算机是否为64bit操作系统,如是,继续如下操作。
    查找是否有两个cvtres.exe。
    C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
    右键属性—详细信息, 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。

    治本的办法是第二步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。

    14. fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.
    最近在使用 VS2015 编译以前用VS2008的项目的时候,提示错误:fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.

    解决方法:在项目的“预处理器定义”中增加 “_XKEYCHECK_H”

    15. CVTRES : fatal error CVT1100: 资源重复。类型: MANIFEST,名称: 1,语言: 0x0409
    LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    fatal error CVT1100: 重复的资源。type:MANIFEST, name:1, language:0x0409 CVTRES
    在资源视图中删除RT_MANIFEST资源。
    项目——属性——清单工具,嵌入清单——否

    16. error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = ‘v100’) cannot be found. To build using the v100 build tools, please install Visual Studio 2010 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting “Upgrade Solution…”. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.Cpp.Platform.targets 64 5 TerrainDemo
    error msb8020 :the builds tools for…

    也就是 VS2013 去编译 VS2010
    右击工程,提升工程

    17. error RC2108: expected numerical dialog constant
    PictureControl 需要显示图片,则需要把 Type 改成 Bitmap
    CONTROL “”,IDC_VIDEOTHUMB,27,103,11,9,NOT WS_GROUP
    改成:
    CONTROL “”,IDC_VIDEOTHUMB,“STATIC”, SS_BITMAP, 27,103,11,9,NOT WS_GROUP

    18. RC 在另一个文件中打开
    在 VC 中关闭所有的页面

    19. error LNK2026: 模块对于 SAFESEH 映像是不安全的
    解决方法:
    1.打开该项目的“属性页”对话框。
    2.单击“链接器”文件夹。
    3.单击“命令行”属性页。
    4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用。

    20. VS2010 解决链接错误:error LNK2019: 无法解析的外部符号 __iob
    该错误主要是由于静态库在VC6编译而主程序在VC2010编译,大家用的CRT不同。解决办法,代码中增加

    #ifdef __cplusplus
    extern “C”
    #endif
    FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};

    此错误的产生根源:
    在VC6的stdio.h之中有如下定义

    _CRTIMP extern FILE _iob[];
    #define stdin (&_iob[0])
    #define stdout (&_iob[1])
    #define stderr (&_iob[2])

    stdin、stdout、stderr是通过查_iob数组得到的。所以,VC6编译的程序、静态库只要用到了printf、scanf之类的函数,都要链接_iob数组。

    而在vc2010中,stdio.h中变成了

    _CRTIMP FILE * __cdecl __iob_func(void);
    #define stdin (&__iob_func()[0])
    #define stdout (&__iob_func()[1])
    #define stderr (&__iob_func()[2])

    _iob数组不再是显式的暴露出来了,需要调用__iob_func()函数获得。所以vc6的静态库链接VC2010的C运行库就会找不到_iob数组.
    通过重新定义
    FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};
    就把vc6需要用到的_iob数组搞出来了

    21. 创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库-问题解决
    解决办法:Release模式下->属性->常规->项目默认值->全程序优化 将这里的默认项 “使用链接时间代码生成”改为“无全程序优化, 接下来就可以运行了。

    22. 默认库“msvcrtd.lib”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
    警告信息如下:

    1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
    原因:
    在使用多线程调试dll(MDd)模式的时候 <位置:配置属性 - c/c++ - 代码生成-运行时库>
    msvcrtd.lib 与 ibcmt.lib产生冲突

    解决方法有2个:
    1.右击工程 - 属性 ”配置属性 - 链接器 - 输入 - 忽略特定库“,添加 ”libcmt.lib“
    2.右击工程 - 属性 ”配置属性 - 链接器 - 命令行” 添加: /NODEFAULTLIB:“libcmt.lib”

    23. error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译
    单击“C/C++”项。
    单击“命令行”属性页。
    在“附加选项”框中键入编译器选项,添加/bigobj。

    展开全文
  • VC文件的使用

    千次阅读 2018-04-15 20:46:42
    VC文件的使用的案例文件常用的有新建,读,写文件,删除文件,读取文件的路径,创建文件夹(目录),文件的复制,移动,重命名,读取文件的大小,查找文件,遍历目录下的文件和子目录,递归遍历目录下的所有文件...

    在VC下文件的使用的案例

    文件常用的有新建,读,写文件,删除文件,读取文件的路径,创建文件夹(目录),文件的复制,移动,重命名,读取文件的大小,

    查找文件,遍历目录下的文件和子目录,递归遍历目录下的所有文件和子目录

    比较少用到的的功能设置文件的属性,使用内存映射文件等


    下面是几个关于文件使用几个函数 : 

    #include <Windows.h>
    #include <stdio.h>
    
    
    //创建文件
    HANDLE CreateFile( __in LPCSTR lpFileName,                 
    	__in DWORD dwDesiredAccess, 						   
    	__in DWORD dwShareMode, 							   
    	__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,   
    	__in DWORD dwCreationDisposition, 					   
    	__in DWORD dwFlagsAndAttributes, 					   
    	__in_opt HANDLE hTemplateFile );					   
    //参数
    //lpFileName			  //操作对象文件的相对或者绝对路径
    //dwDesiredAccess		  //指明对象文件的操作存取方式 GENERIC_READ, GENERIC_WRITE, GENERIC_READGENERIC_WRITE
    //dwShareMode			  //指明与其他进程是否共享该文件,可以读,写,删除共享等FILE_SHARE_WRITE, 如果进程独占改文件,设置为0
    //lpSecurityAttributes	  //表示文件句柄的安全属性,一般设置为NULL,有特殊要求特别设置
    //dwCreationDisposition	  //文件操作模式 CREATE_ALWAYS, CREATE_NEW, OPEN_ALWAYS, OPEN_EXISTING, TRUNCATE_EXISTING
    //dwFlagsAndAttributes	  //文件属性和标志, 一般设置为FILE_ATTRIBUTE_NORMAL
    //hTemplateFile			  //当存取权限包括GENERIC_WRITE, 可以设置一个模板文件的句柄.一般设置为NULL
    
    
    
    HANDLE hFile = CreateFile(".\\setting.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
    
    //从文件中读取数据
    BOOL ReadFile(__in        HANDLE hFile,																	         
    	__out_bcount_part_opt(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,   
    	__in        DWORD nNumberOfBytesToRead,																	     
    	__out_opt   LPDWORD lpNumberOfBytesRead,																	 
    	__inout_opt LPOVERLAPPED lpOverlapped);																	     
    //参数
    //hFile				文件句柄,文件操作方式应该是GENERIC_READ
    //lpBuffer			读取文件数据存储数据的内存缓冲区
    //nNumberOfBytesToRead 指明需要需要从文件中读出的数据的大小,不能大于lpBuffer的大小,否则会溢出
    //lpNumberOfBytesRead输出参数,指向存储实际独处的数据大小DWORD变量
    //lpOverlapped:输出参数,如果抵用CreateFile函数设置了FILE_FLAG_OVERLAPPED标志,则需要使用该参数,否则可以为NULL
    
    //从文件中写入数据
    BOOL WriteFile( __in HANDLE hFile,                   					
    	__in_bcount_opt(nNumberOfBytesToWrite) LPCVOID lpBuffer,			
    	__in DWORD nNumberOfBytesToWrite, 									
    	__out_opt LPDWORD lpNumberOfBytesWritten, 							
    	__inout_opt LPOVERLAPPED lpOverlapped );	     					
    //参数
    //hFile					  文件句柄
    //lpBuffer				  需要写入文件的缓冲区
    //nNumberOfBytesToWrite	  指明需要写入文件中的数据的大小
    //lpNumberOfBytesWritten  指向真是写入的数据大小的变量
    //lpOverlapped:输出参数,如果抵用CreateFile函数设置了FILE_FLAG_OVERLAPPED标志,则需要使用该参数,否则可以为NULL
    
    
    //获取文件的大小
    DWORD GetFileSize(HANDLE hFile, LPDWORD lpFilesizeHigh);
    //参数
    //HANDLE hFile 文件句柄
    //LPDWORD lpFilesizeHigh 输出函数, 表示得到的文件大小的高32位,该参数可以设置为NULL
    //还有一个获取文件大小的函数 BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);
    
    
    //删除文件
    BOOL DeleteFile( LPCTSTR lpFileName );
    //参数  LPCTSTR lpFileName 表示要删除文件的相对路径或绝对路径
    //返回值BOOL 表示文件删除是否成功,如果程序返回失败,可以用GetLastError()获取错误信息
    
    //复制文件
    BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);
    //参数 
    //lpExistingFileName : 已经存在的所需复制文件的原路径
    //lpNewFilename : 新文件路径,复制文件的目的路径
    //bFailIfExists : 指明如果在目的路径存在文件时是否覆盖,如果设置为TRUE,则不覆盖,如果存在,则返回失败(0x50)
    
    //移动文件(该函数的功能 : 移动,重命名和目录)
    BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);
    //参数 
    //lpExistingFileName : 已经存在的所需移动文件的原路径
    //lpNewFilename : 新文件路径,移动文件的目的路径
    
    //CopyFileEx, MoveFileEx, MoveFileWithProcessSS函数功能更加丰富
    
    
    //创建一个目录或者文件夹
    BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
    //lpPathName : 所需要创建的目录或者路径
    //lpSecurityAttributes : 输入参数,设置为NULL
    //返回值 如果失败,可以使用GetLastError函数获取错误信息, 
    //可能的值包括ERROR_ALREADY_EXISTS(文件已经存在), ERROR_PATH_NOT_FOUND
    
    //获取进程的当前目录
    DWORD GetCurrentDirectory( DWORD nBufferLength, LPTSTR lpBuffer );
    //参数
    //nBufferLength : 输入参数,存储路径字符串缓冲区的大小,一般调用MAX_PATH
    //lpBuffer: 输出参数,只想获取的路径字符串
    //返回值 : 如果为0,表示失败。 如果非0,表示获取的字符串的长度
    
    //设置进程的当前目录
    BOOL SetCurrentDirectory(LPCTSTR lpPathName);
    //参数
    //lpPathName : 输入参数,所要设置的路径
    
    
    //获取模块文件名
    DWORD GetModuleFileName( __in_opt HMODULE hModule, 								
    	                     __out_ecount_part(nSize, return + 1) LPSTR lpFilename,	
    						 __in DWORD nSize );
    
    //hModule : 所需要模块路径的模块句柄,设置为NULL表示当前模块路径
    //lpFilename: 模块的全路径
    //nSize : 指向缓冲区的大小
    
    //返回值 : 如果为0,表示失败。 如果非0,表示获取的字符串的长度
    
    
    //对文件进行查找,遍历指定目录下的文件和子目录
    //WINDOW api中,有一组专门的函数和数据结构,用于遍历目录, 
    //他们是FindFirstFile, FindNextFile, WIN32_FIND_DATA
    BOOL FindNextFile( __in HANDLE hFindFile,
    				   __out LPWIN32_FIND_DATAA lpFindFileData );
    //hFindFile  查找的目录,需使用通配符指定查找的文件目标
    //lpFindFileData 指向WIN32_FIND_DATA结构的指针,为找到的文件及若干属性信息
    
    HANDLE FindFirstFile( __in LPCSTR lpFileName,
    	                  __out LPWIN32_FIND_DATAA lpFindFileData );
    //lpFileName 查找句柄
    //lpFindFileData 指向WIN32_FIND_DATA结构的指针,为找到的文件及若干属性信息
    
    //关键的结构体
    
    typedef struct _WIN32_FIND_DATAA {
    	DWORD dwFileAttributes;
    	FILETIME ftCreationTime;
    	FILETIME ftLastAccessTime;
    	FILETIME ftLastWriteTime;
    	DWORD nFileSizeHigh;
    	DWORD nFileSizeLow;
    	DWORD dwReserved0;
    	DWORD dwReserved1;
    	CHAR   cFileName[ MAX_PATH ];
    	CHAR   cAlternateFileName[ 14 ];
    #ifdef _MAC
    	DWORD dwFileType;
    	DWORD dwCreatorType;
    	WORD  wFinderFlags;
    #endif
    } WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
    
    //实现对指定目录中文件和子目录的遍历,并将遍历得到的文件和其他属性打印到界面上
    DWORD EnumerateFileInDirectory(LPSTR szPath)
    {
    	WIN32_FIND_DATA FindFileData;
    	HANDLE hListFile;
    	CHAR szFilePath[MAX_PATH];
    
    	//构造代表子目录和文件夹路径的字符串,使用通配符"*"
    	lstrcpy(szFilePath, szPath);
    	//注释的代码可以用于查找所有的以".txt"结尾的文件
    	//lstrcat(szFilePath, "\\*.txt");
    	lstrcat(szFilePath, "\\*");
    	//查找第一个文件/目录, 获取查找句柄
    	hListFile = FindFirstFile(szFilePath, &FindFileData);
    	if (hListFile == INVALID_HANDLE_VALUE)
    	{
    		return 1;
    	}
    	else
    	{
    		do 
    		{
    			/*如果不想显示代表本级目录和上一级目录的"."和".."
    			可以使用注释部分的代码过滤
    			if (lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 || lstrcmp(FindFileData.cFileName, TEXT("..")) == 0)
    			{
    				continue;
    			}
    			*/
    			//打印文件名,目录名
    			printf("%s\t\t", FindFileData.cFileName);
    
    			//判断文件属性,是否为加密文件或文件夹
    			if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED)
    			{
    				printf("加密\n");
    			}
    			//判断文件属性是否为隐藏文件或文件夹
    			if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
    			{
    				printf("隐藏\n");
    			}
    			//判断文件属性是否为目录
    			if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    			{
    				printf("DIR");
    				//如果是目录,可以继续查找下去
    				CHAR szNewFilePath[MAX_PATH] = {9};
    				wsprintf(szNewFilePath, "%s\\%s", szPath, FindFileData.cFileName);
    				EnumerateFileInDirectory(szNewFilePath);
    			}
    		} while (FindNextFile(hListFile, &FindFileData));
    	}
    	return 0;
    }
    
    
    /*************************************************************
    SaveDataToFile
    功能 : 读取文件内容
    参数 : LPSTR szFilePath       文件路径
    **************************************************************/
    DWORD ReadFileContent(LPSTR szFilePath)
    {
    	//文件句柄
    	HANDLE hFileRead = NULL;
    	//保持文件大小
    	LARGE_INTEGER liFileSize;
    	//成功读取文件数据大小
    	DWORD dwReadedSize;
    	//累加计算已经读取数据大小
    	LONGLONG liTotalRead = 0;
    	//文件数据缓存
    	BYTE lpFileDataBuffer[32] = {0};
    
    	//打开已有文件,读取内容
    	hFileRead = CreateFile(szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    	//打开文件是否成功
    	if (hFileRead == INVALID_HANDLE_VALUE)
    	{
    		printf("打开文件失败 : %d\n", GetLastError());
    		return 0;
    	}
    	if (!GetFileSizeEx(hFileRead, &liFileSize))
    	{
    		printf("获取文件大小失败 : %d\n", GetLastError());
    		return 0;
    	}
    	else
    	{
    		printf("文件大小为 : %d\n", liFileSize.QuadPart);
    	}
    	
    	//循环读取文件并打印文件内容
    	while (1)
    	{
    		DWORD i;
    		if (!ReadFile(hFileRead, lpFileDataBuffer, 32, &dwReadedSize, NULL))
    		{
    			printf("读取文件错误 : %d\n", GetLastError());
    		}
    		printf("读取了%d 个字节, 文件内容是 : ", dwReadedSize);
    		for (i = 0; i < dwReadedSize; i++)
    		{
    			printf("0x%x", lpFileDataBuffer[i]);
    		}
    		printf("\n");
    		liTotalRead += dwReadedSize;
    		if (liTotalRead == liFileSize.QuadPart)
    		{
    			printf("文件读取结束!\n");
    			break;
    		}
    	}
    	CloseHandle(hFileRead);
    	return 1;
    }
    
    /*************************************************************
    SaveDataToFile
    功能 : 将数据存储到文件末尾
    参数 : LPSTR szFilePath       文件路径
    	   LPVOID lpData          需存储的数据
    	   DWORD dwDataSize       数据大小(字节)
    **************************************************************/
    DWORD SavaDataToFile(LPSTR szFilePath, LPVOID lpData, DWORD dwDataSize)
    {
    	//文件句柄
    	HANDLE hFileWrite = NULL;
    	//成功写入的数据大小
    	DWORD dwWriteDataSize = 0;
    	//打开已经存在的文件,读取内容
    	hFileWrite = CreateFile(szFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (hFileWrite == INVALID_HANDLE_VALUE)
    	{
    		printf("打开文件失败 : %d\n", GetLastError());
    		return 0;
    	}
    	//设置文件指针到文件尾
    	SetFilePointer(hFileWrite, 0, 0, FILE_END);
    	//将数据写入文件
    	if (!WriteFile(hFileWrite, lpData, dwDataSize, &dwWriteDataSize, NULL))
    	{
    		printf("写入文件失败 : %d\n", GetLastError());
    		return 0;
    	}
    	else
    	{
    		printf("写入文件成功, 写入 %d 个字节!\n", dwWriteDataSize);
    	}
    	CloseHandle(hFileWrite);
    	return 1;
    }
    
    
    //ini文件的测试代码
    void TestINIFile()
    {
    	//在当前程序目录下创建一个user_setting.ini文件
    	HANDLE hFile = NULL;
    	hFile = CreateFile(".\\user_setting.ini", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (NULL == hFile)
    	{
    		printf("文件创建失败!\n");
    		return;
    	}
    	CloseHandle(hFile);
    
    	//在user_setting.ini文件中创建一个section,并写入数据
    	BOOL bRet = FALSE;
    	bRet = WritePrivateProfileString("Column_Section", "Column_Width", "500", ".\\user_setting.ini");
    	bRet = WritePrivateProfileString("Column_Section", "Column_Height", "500", ".\\user_setting.ini");
    	bRet = WritePrivateProfileString("Column_Section", "Column_Angle", "0.0", ".\\user_setting.ini");
    	bRet = WritePrivateProfileString("Column_Attribute", "Column_Id", "1", ".\\user_setting.ini");
    	bRet = WritePrivateProfileString("Column_Attribute", "Column_Color", "Red", ".\\user_setting.ini");
    	bRet = WritePrivateProfileString("Column_Attribute", "Column_Point", "Original", ".\\user_setting.ini");
    	//从user_setting.ini文件中读取某个section的一个key的字符串
    	CHAR Column_Width[100] = {0};
    	DWORD dwRes = 0;
    	dwRes = GetPrivateProfileString("Column_Section", "Column_Width", "300", Column_Width, 100, ".\\user_setting.ini");
    	CHAR Column_Height[100] = {0};
    	dwRes = GetPrivateProfileString("Column_Section", "Column_Width", "300", Column_Height, 100, ".\\user_setting.ini");
    	CHAR Column_Angle[100] = {0};
    	dwRes = GetPrivateProfileString("Column_Section", "Column_Width", "300", Column_Angle, 100, ".\\user_setting.ini");
    
    	//从ini文件中读取整个section的内容
    	CHAR Column_Attribute[300] = {0};
    	dwRes = GetPrivateProfileSection("Column_Attribute", Column_Attribute, 300, ".\\user_setting.ini");
    	printf("%s\n", Column_Attribute);
    	//从ini文件中读取section的名称, 如果 ini 中有两个 Section: [sec1] 和 [sec2],则返回的是 'sec1',0,'sec2',0,0
    	CHAR Section_Name[100] = {0};
    	dwRes = GetPrivateProfileSectionNames(Section_Name, 100, ".\\user_setting.ini");
    	printf("%s\n", Section_Name);
    
    	//将一个整个section的内容加入到另外指定的section中, Column_Attribute中的内容覆盖了原来Column_Section中的内容
    	bRet = WritePrivateProfileSection("Column_Section", Column_Attribute, ".\\user_setting.ini");
    }
    
    //获取当前目录,获取程序所在的目录,获取模块路径
    void TestOnDirectory()
    {
    	//用于储存当前路径
    	CHAR szCurrentDirectory[MAX_PATH] = {0};
    	//用于储存模块路径
    	CHAR szMoudlePath[MAX_PATH] = {0};
    	//Kernel32文件名与句柄
    	LPSTR szKernel32 = "kernel32.dll";
    	HMODULE hKernel32;
    	//当前路径的长度,也用于判断获取是否成功
    	DWORD dwCurDirPathLen;
    	//获取进程的当前目录
    	dwCurDirPathLen = GetCurrentDirectory(MAX_PATH, szCurrentDirectory);
    	if (dwCurDirPathLen == 0)
    	{
    		return;
    	}
    	printf("%s\n", szCurrentDirectory);
    
    	//将进程当前的目录设置为 "C:\"
    	lstrcpy(szCurrentDirectory, "C:\\");
    	if (!SetCurrentDirectory(szCurrentDirectory))
    	{
    		return;
    	}
    
    	//在当前目录下创建子目录“current_dir"
    	CreateDirectory("current_dir", NULL);
    
    	//再次获取系统当前目录
    	dwCurDirPathLen = GetCurrentDirectory(MAX_PATH, szCurrentDirectory);
    	if (dwCurDirPathLen == 0)
    	{
    		return;
    	}
    	printf("GetCurrentDirectory获取的当前目录为 %s\n", szCurrentDirectory);
    
    	//使用NULL参数,获取本模块的路径
    	if (!GetModuleFileName(NULL, szMoudlePath, MAX_PATH))
    	{
    		return;
    	}
    	printf("本模块路径 %s", szMoudlePath);
    
    	//获取Kernel32.dll的模块句柄
    	hKernel32 = LoadLibrary(szKernel32);
    
    	//获取kernel32.dll的模块句柄
    	if (!GetModuleFileName(hKernel32, szMoudlePath, MAX_PATH))
    	{
    		return;
    	}
    	printf("kernel32.dll模块路径 %s", szMoudlePath);
    
    	return;
    }
    
    //对文件的属性进行显示的一些函数
    
    DWORD ShowFileTime(PFILETIME lptime);
    DWORD ShowFileSize(DWORD dwFileSizeHigh, DWORD dwFileSizeLow);
    DWORD ShowFileAttrInfo(DWORD dwAttribute);
    DWORD ShowFileAttribute(LPSTR szPath)
    {
    	WIN32_FILE_ATTRIBUTE_DATA wfad;
    	printf("文件 : %s\n", szPath);
    	//获取文件属性
    	if (!GetFileAttributesEx(szPath, GetFileExInfoStandard, &wfad))
    	{
    		return 1;
    	}
    	//显示相关信息
    	printf("创建时间 : \t");
    	ShowFileTime(&(wfad.ftCreationTime));
    	printf("最后访问时间 : \t");
    	ShowFileTime(&(wfad.ftLastAccessTime));
    	printf("最后修改时间 : \t");
    	ShowFileTime(&(wfad.ftLastWriteTime));
    	
    	//显示文件的大小
    	ShowFileSize(wfad.nFileSizeHigh, wfad.nFileSizeLow);
    	//显示文件属性
    	ShowFileAttrInfo(wfad.dwFileAttributes);
    	return 0;
    }
    
    DWORD ShowFileTime(PFILETIME lptime)
    {
    	//文件时间结构
    	FILETIME ftLocal;
    	//系统时间结构
    	SYSTEMTIME st;
    	//调整为系统所在时区的时间
    	FileTimeToLocalFileTime(lptime, &ftLocal);
    	//将文件时间格式转换
    	FileTimeToSystemTime(&ftLocal, &st);
    	//显示时间字符
    	printf("%4d year  %2d month  %2d day, %#02d:%#02d:%#02d\n", st.wYear, st.wMonth, st.wDay, st.wMinute, st.wSecond);
    	return 0;
    }
    DWORD ShowFileSize(DWORD dwFileSizeHigh, DWORD dwFileSizeLow)
    {
    	ULONGLONG liFilesize;
    	liFilesize = dwFileSizeHigh;
    	//移动到32位
    	liFilesize <<= sizeof(DWORD) * 8;
    	liFilesize += dwFileSizeLow;
    	printf("文件大小 : \t%I64u字节\n", liFilesize);
    	return 0;
    }
    DWORD ShowFileAttrInfo(DWORD dwAttribute)
    {
    	//一次判断文件的属性并显示
    	printf("文件属性 : \t");
    	if (dwAttribute & FILE_ATTRIBUTE_ARCHIVE)
    	{
    		printf("ARCHIVE\N");
    	}
    	if (dwAttribute & FILE_ATTRIBUTE_COMPRESSED)
    		printf("压缩文件");
    	if (dwAttribute & FILE_ATTRIBUTE_DIRECTORY)
    		printf("目录文件");
    	if (dwAttribute & FILE_ATTRIBUTE_ENCRYPTED)
    		printf("加密文件");
    	if (dwAttribute & FILE_ATTRIBUTE_HIDDEN)
    		printf("隐藏文件");
    	if (dwAttribute & FILE_ATTRIBUTE_NORMAL)
    		printf("Normal");
    	if (dwAttribute & FILE_ATTRIBUTE_OFFLINE)
    		printf("OFFLINE");
    	if (dwAttribute & FILE_ATTRIBUTE_READONLY)
    		printf("只读文件");
    	if (dwAttribute & FILE_ATTRIBUTE_SPARSE_FILE)
    		printf("sparse");
    	if (dwAttribute & FILE_ATTRIBUTE_SYSTEM)
    		printf("系统文件");
    	if (dwAttribute & FILE_ATTRIBUTE_TEMPORARY)
    		printf("临时文件");
    	printf("\n");
    	return 0;
    }
    
    //给文件添加其他属性
    DWORD SetFileHiddenAndReadOnly(LPSTR szFileName)
    {
    	//获取原来的属性
    	DWORD dwFileAttributes = GetFileAttributes(szFileName);
    	//添加
    	dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
    	dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;
    	//设置文件属性,并判断是否成功
    	if (SetFileAttributes(szFileName, dwFileAttributes))
    	{
    		printf("文件 %s 的隐藏和属性设置成功\n", szFileName);
    	}
    	else
    	{
    		printf("文件设置失败 %d\n", GetLastError());
    	}
    	return 0;
    }
    
    //对文件进行复制,删除,移动
    int main(int argc, PCHAR argv[])
    {
    	if (0 == lstrcmp("-d", argv[1]) && argc == 3)
    	{
    		if (!DeleteFile(argv[2]))
    		{
    			printf("删除文件错误!\n");
    			return 1;
    		}
    		else
    		{
    			printf("删除文件成功!\n");
    		}
    	}
    	else if (0 == lstrcmp("-c", argv[1]) && argc == 4)//复制文件
    	{
    		if (!CopyFile(argv[2], argv[3], TRUE))
    		{
    			//lastError == 0X50,文件存在
    			if (GetLastError() == 0x50)
    			{
    				printf("文件已经存在,是否覆盖? Y/N", argv[3]);
    				if ('y' == getchar())
    				{
    					//复制,覆盖已经存在的文件
    					if (!CopyFile(argv[2], argv[3], FALSE))
    					{
    						printf("复制文件错误!\n");
    					}
    					else
    					{
    						printf("复制成功!\n");
    					}
    				}
    				else
    					return 0;
    			}
    		}
    	}
    	else if (0 == lstrcmp("-m", argv[1]) && argc == 4)
    	{
    		if (!MoveFile(argv[2], argv[3]))
    		{
    			printf("移动文件错误\n");
    		}
    		else
    		{
    			printf("参数错误!\n");
    		}
    	}
    		
    	return 0;
    }





    展开全文
  • VC\c++ 对文本文件读写方法(sys,txt)

    千次阅读 2013-10-10 11:46:42
    ifstream 和 ofstream( 引用) C++标准库 之 iostream库的学习笔记(二)fstream库...在C++,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:
  • VC中调用DLL文件

    2013-11-23 14:21:55
    Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windo
  • VC 调试一些常见的错误信息及解决方法: 1、调试时出现 LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 错误 原因:需要 MFC 支持的程序需要用 win32 Application 来生成,如果用 win...
  • VC怎样判断一个文件存在

    千次阅读 2016-07-20 11:29:28
    最近的项目是对文件操作的,所以,多少都遇到...通过它的方法CFile.Exit(Filename)就可以直接判断文件是否存在,可是在VC里没有这个方法. 最开始时,我是通过定义一个文件变量,然后打开一个那个要判断的文件,如果返回0,
  • VC读取音频文件

    千次阅读 2011-05-16 23:54:00
    vc 读取音频文件
  • [转]VC生成MAP文件

    千次阅读 2012-12-22 21:01:42
    [转]VC生成MAP文件  MS-VC 使用MAP文件快速定位程序崩溃代码行 收藏 作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统造成巨大的损失。但在一个大型...
  • 目录: 一:什么是工程? 二:什么事cpp文件? 三:工程和CPP文件的关系? ...四:添加文件会有影响吗?...一个工程就是一个exe文件,能够运行的是exe文件 ...工程可以有多个cpp文件,但是只能产生一个exe文件。产...
  • vc打开文件和打开文件所在目录

    千次阅读 2012-02-10 13:36:01
    一、打开文件 1.⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow); ⑵ 参数: lpCmdLine:指向一个空结束的字符串,串包含将要执行的应用程序的命令行(文件名加上可选参数)。 ...
  • VC中,中文注释引起的错误

    千次阅读 2010-03-27 14:34:00
    只有特定序列碰巧使得它“最佳匹配算法”误判才行,你加入任何一个字符,就改变了序列,最佳匹配算法就不错了,当然就没问题了。 例如,如果“字*/”导致*被吃掉,如果你写成“字 */”,它就吃不掉了,如果你改成...
  • vc中读取wav文件的时长和文件播放的几种方式 读取wav文件的时长: int GetTimeLength() //获取声音文件数据的函数,pString参数指向要打开的声音文件; { HMMIO file;//定义HMMIO文件句柄; file=...
  • VC++(VS2010)读写Excel文件代码(附示例)

    千次下载 热门讨论 2014-11-22 13:27:24
    工作或学习可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1...
  • VC和C++按行读取文本文件

    千次阅读 2013-10-23 23:37:28
    下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体。 3.fseek用法 int fseek(FILE *stream, long offset, int fromwhere); 参数: 第一个参数file指针 第二个参数...
  • 在 VC++6.0 使用 ActiveX 控件的前提是此电脑上有这个控件的注册信息,例如想使用 FlexGrid 控件,你就必须下载 FlexGrid 的 OCX 文件,上网了解可知是 msflexgrid.ocx 文件。之后就在 C://WINDOWS//system32 (32...
  • VC2005创建和加载.DLL文件的方法

    千次阅读 2015-09-22 14:34:10
    动态链接库(DLL)简介  动态链接库(DLL)一直都是windows OS...他们是一些独立的文件,其中包含能被可执行程序或其他DLL调用来完成某项工作的函数,只有在其他模块调用动态链接库的函数时,他才发挥作用。 静态
  • VC中debug行号定位错误

    2015-04-03 10:30:05
    但是DEGUG时下的断点的行号总是不对,比如我下在timer函数的断点,在运行时会显示到另一个函数。 出现这样的情况是因为我在linux写程序时加入了中文的注释,在windows下编译时会出以下的警告: 1>e:\new_work...
  • 这种方式可以直接调用外部我们自己准备好的JS函数,而不需要打开网页,只能调用网页里的JS函数。...#import "C:\\Windows\\SysWOW64\\msscript.ocx" //ocx文件的位置, using namespace MSScriptCont...
  • VC中debug和release版本的区别

    千次阅读 2016-04-27 20:15:57
    在使用VC开发软件的过程,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的几点经验,看看...
  • 初学者有的时候可能会遇到这样的问题,我们想在VC++创建的项目添加一个资源文件,在一开始添加的时候我们在项目添加资源文件,新建一个文本文件然后命名为.rc的文件类型的文件,但是有的时候往往出现载入失败,...
  • vc6常见错误

    2017-05-23 09:22:54
    VC6.0编译常见错误 第一部分 编译错误  1. error C2001: newline in constant 编号:C2001  直译:在常量出现了换行。 错误分析:  (1) 字符串常量、字符常量是否有换行。  (2) 在这句语句,...
  • 发生异常的时候windows通常会弹出一个错误对话框,点击详细信息,我们能获得出错的地址和大概的出错信息,然后可以用以下办法分析我们的程序。   一. 用MAP文件定位异常代码位置。 1. 如何生成map文件 ...
  • External Dependencies是说你没有把这个文件加入到这个工程,但是需要这个文件的支持。当然有时是误操作。比如你从工程里面删除了abc.h但是在其中一个文件中用#include包含了这个文件,那么,abc.h就会进入...
  • VC点击按键弹出文件路径选择对话框

    千次阅读 2015-01-19 22:49:25
    void CServerDlg::OnBnClickedButtonSavePath() { ...bi.lpszTitle = _T("请选择数据文件...MessageBox(L"无效的目录,请重新选择,也可以不选择存储目录,则数据文件存储在当前路径下", L"操作错误"); } }
  • VC如何调用DLL文件

    2010-10-10 21:42:00
    文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。...
  • CDatabase对象表示到数据源的连接,通过它可以操作数据源。...在应用可以同时使一个或多个CDatabase对象活动。 注意: 如果在处理数据访问对象(DAO)类而不是开放数据库连接(ODBC)类,可使用类CDaoData
  • VC中常见LINK错误及解决方案

    千次阅读 2011-08-12 11:22:19
    . Windows子系统设置错误, 提示: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,030
精华内容 16,012
关键字:

vc中加入文件错误