精华内容
下载资源
问答
  • 实验 Linux下文件程序设计

    千次阅读 2019-04-26 10:05:42
    实验Linux下文件程序设计 基本信息 实验课程:Linux程序设计设课形式:非独立 课程学分:2实验项目:Linux下文件程序设计 项目类型:验证项目学时:2 实验预习 实验目的和要求: Linux系统的文件属性 不带...

    实验六Linux下文件程序设计

    基本信息

    实验课程:Linux程序设计              设课形式:非独立

    课程学分:2                           实验项目:Linux下文件程序设计

    项目类型:验证                        项目学时:2

    实验预习

    实验目的和要求:

    1. Linux系统的文件属性
    2. 不带缓存的文件I/O操作
    3. 基于流的文件I/O操作
    4. 特殊文件的操作

    实验条件:

    1、装有Linux操作系统的微型计算机;

    实验过程

      1. Linux系统文件的属性
    1. Linux系统中,文件的准确定义是不包含有任何其他结构的字符流。
    2. Linux系统提供的文件系统,是树形层次结构系统。
    3. Linux支持多种文件系统,最常用的文件系统是ext2系统。
    4. Linux系统的文件属性主要包括文件类型和文件权限两个方面。

     

    6.1.1Linux文件类型

    1. Linux下最常见的文件类型有5种:普通文件、目录文件、链接文件、管道文件和设备文件。
    2. Linux系统的主要文件类型:

     

    例6-1设计一个程序,要求列出当前目录下的文件信息,以及系统“/dev/sda1”和“/dev/lp0”的文件信息。

    编辑源程序代码:

     

    6.1.2 Linux文件权限

    1. 对于Linux系统中的文件来说,它的权限可以分为4种:可读取(Readable)、可写入(Writable)、可执行(eXecute)和无权限,分别用r、w、x和-表示。
    2. Linux系统按文件所有者、文件所有者同组用户和其它用户三类规定不同的文件访问权限。
    3. 显示的作为权限的10个字符,可分为四部分:
      1. 第一位:一般表示文件类型。
      2. 第二位到第四位(第一组rwx):表示文件所有者的访问权限。
      3. 第五位到第七位(第二组rwx):表示文件所有者同组用户的访问权限。
      4. 第八位到第十位(第三组rwx):表示其他用户的访问权限。
    1. chmod函数说明

    1. mode参数说明

     

    例6-2设计一个程序,要求把系统中“/etc”目录下的passwd文件权限,设置成文件所有者可读可写,所有其他用户为只读权限。

     

    源程序代码:

     

    1. umask函数说明

    6-3设计一个程序,要求设置系统文件与目录的权限掩码。

     

    源程序代码

     

    注意:运行一次此例的程序后,修改源程序中的掩码后,再次编译运行,文件“liu1”和“liu2”的权限并不改变。因为如果文件已经存在,touch只修改时间标记。如果要再次验证新的掩码,需要再次运行程序前删除原来的文件。

     

    思考题:设计一个程序,要求Linux系统新建的文件权限是0400

    6.1.3  Linux文件的其他属性

    1. 文件还有创建时间,大小等其他的属性。
    2. Linux系统中,定义了stat结构体来存放这些信息。
    3. 如果要获得文件的其他属性,可以使用stat函数或者fstat函数。
    4. stat函数用来判断没有打开的文件,而fstat函数用来判断打开的文件。使用较多的属性是st_mode,通过此属性可以判断给定的文件是一个普通文件还是其他文件类型。

    1. stat函数说明

    6-4设计一个程序,应用系统函数stat获取系统中“/etc”目录下的passwd文件的大小。

     

    源程序代码:

     

    思考题:

    1. 设计一个程序,要求判断“/etc/passwd”的文件类型。

    使用st_mode属性,可以使用几个宏来判断:S_ISLNK(st_mode) 是否是一个连接,S_ISREG是否是一个常规文件S_ISDIR是否是一个目录,S_ISCHR是否是一个字符设备,S_ISBLK是否是一个块设备,S_ISFIFO是否是一个FIFO文件,S_ISSOCK是否是一个SOCKET文件。

    1. 设计一个程序,要求打开文件“/etc/passwd”判断它的最后一次访问时间。

      1. 不带缓存的文件I/O操作
    1. Linux系统中,基于文件描述符的文件操作主要有:不带缓存的文件I/O操作和带缓存的文件流I/O操作。
    2. 不带缓存的文件I/O操作,又称系统调用I/O操作,符合POSIX标准,设计的程序能在兼容POSIX标准的系统间方便地移植。
    3. 不带缓存的文件I/O操作用到的主要函数:

     

    6.2.1  文件的创建

    1. creat函数说明

    例6-5设计一个程序,要求在“/home”目录下创建一个名称为“6-5file”的文件,并且把此文件的权限设置为所有者具有只读权限,最后显示此文件的信息。

     

    源程序代码:

    思考题:设计一个程序,要求在“/mnt”目录下创建一个名称为“usb”的文件,编辑、调试成功后,运行两次是否有问题?为什么?

    6.2.2  文件的打开和关闭

    1. open函数说明

    1. close函数说明

     

    6-6设计一个程序,要求在“/home”下以可读写方式打开一个名为“6-6file”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。

    源程序代码:

     

    思考题:设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。

    6.2.3文件的读写操作

    1. 文件读写操作中,经常用到的函数是read、write和lseek。
    2. Read、write函数说明

     

     

    例6-7设计一个C程序,完成文件的复制工作。要求通过使用read函数和write函数复制“/etc/passwd”文件到“4-7test”文件中,文件名当程序运行时从键盘键入。

    源程序代码:

     

     

    思考题:

    1. 设计一个程序,使用read函数从源文件读取数据,再用write函数写入到目标文件,源文件名和目标文件名都由键盘输入。

    1. 设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件,如果已存在,把字符串“usb作为优盘设备文件”写入此文件后关闭。

    6.2.4文件上锁

    1. Linux系统中,给文件上锁主要有建议性锁和强制性锁。给文件加建议性锁的是flock函数,给文件加强制性锁的是fcntl函数。
    2. 一般情况下,系统使用强制性锁,而很少使用建议性锁。当一个文件被上锁后,内核将阻止其他任何文件对其进行读写操作。
    3. flock、fcntl函数说明

     

    例6-8设计一个程序,要求在“/home”下打开一个名为“6-8file”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。

     

    源程序代码:

     

     

     

    注意:程序在终端中运行后会暂停,需要按任意健后程序才会继续运行。

    思考题:设计一个程序,要求在“/mnt”目录下,打开名称为“usb”的文件,如果该文件不存在,则创建此文件。打开后对其加上强制性的写入锁,然后释放写入锁。

      1. 带缓存的流文件I/O操作
    1. 带缓存的流文件I/O操作,是在内存开辟一个“缓存区”,为程序中的每一个文件使用。
    2. 内存“缓存区”的大小,影响着实际操作外存的次数,内存“缓存区”越大,则操作外存的次数就少,执行速度就快、效率高。
    3. 带缓存的文件I/O操作用到的主要函数

     

    6.3.1流文件的打开和关闭

    例6-9设计一个程序,要求用流文件I/O操作打开文件“6-9file”,如果该文件不存在,则创建此文件。

    源程序代码:

    思考题:设计一个程序,要求用带缓存的流文件I/O操作,在“/tmp”目录下,打开名称为“tmpfile”的文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。

    6.3.2  流文件的读写操作

    6-10设计一个程序,要求把键盘上输入的字符写入文件“6-10file”如果该文件不存在,则创建此文件。

    源程序代码:

     

    思考题:

    1. 程序运行后,输入的字符如果是半角的中文,文件中能否写入?为什么?
    2. 设计一个程序,要求用带缓存的流文件I/O操作,利用fputc函数把键盘上输入的字符串写入文件“/tmp/4-10tmp”如果该文件不存在,则创建此文件。

    6-11设计一个程序,要求把键盘上输入的字符写入文件“6-11file”如果该文件不存在,则创建此文件。

    源程序代码:

     

     

    思考题:

    1. 设计一个程序,要求用带缓存的流文件I/O操作,把键盘上输入的字符串写入文件“/tmp/6-11tmp”如果该文件不存在,则创建此文件,多次运行程序多次输入字符串后,文件“/tmp/6-11tmp”中只保存最后一次输入的字符串。

    1. 设计一个程序,要求用带缓存的流文件I/O操作,把文件“/tmp/6-11tmp”中的内容读取出来,在终端中打印输出。

    6-12设计两个程序,要求一个程序把三个人的姓名和帐号余额信息,通过一次流文件I/O操作写入文件“6-12file”,另一个格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。

    6-12fwrite.c6-12fread.c程序代码

     

     

    思考题:

    1. 完善例6-12的程序,使得帐号和余额都可以从键盘输入,余额可以输入小数。
    2. 设计一个程序,要求把一个文本文件“6-12test”中的数据读出,文本文件“6-12test”有两列数据,第一列是帐号(11位整数表示),第二列是帐号余额(double数据类型),两列数据间用逗号隔开,按帐号余额从小到大排序后,把排序后的数据写入文本文件“6-12sort”,帐号要和余额一一对应。

     

    6.3.3文件的定位

    1. 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有三个,即rewind 函数、fseek函数和ftell函数。

    例6-13设计一个程序,要求用fopen函数打开系统文件“/etc/passwd”,先把位置指针移动到第10个字符前,再把位置指针移动到文件尾,最后把位置指针移动到文件头,输出三次定位的文件偏移量的值。

     

    源程序代码:

     

    思考题:设计一个程序,要求从系统文件“/etc/passwd”读取偏移量从100200之间的字符,写入“/tmp/pass”文件。

     

      1. 目录与链接文件

    6.6.1  目录文件的操作

    1. 目录文件是Linux中一种比较特殊的文件,它是Linux文件系统结构中骨架,对构成整个树型层次结构的Linux文件系统非常重要。
    2. 对目录文件的操作可以使用mkdir函数、opendir函数、closedir函数、readdir函数和scandir函数等。

     

    例6-14设计一个程序,要求读取系统目录文件“/etc/rc.d”中所有的目录结构。

     

    源程序代码:

     

    思考题:设计一个程序,要求读取“/etc” 目录下所有的目录结构,并依字母顺序排列。

     

    6.6.2链接文件的操作

    1. Linux系统中的链接文件,有点类似于Windows系统中的“快捷方式”,但并不完全一样。

    1.软链接文件

    1. 软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为“断链”的问题,链接文件甚至可以循环链接自己。类似于编程语言中的递归。

    2.硬链接文件

    1. 对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容,这时,系统就“忘记”了它曾经是硬链接文件,而把它当成一个普通文件。
    2. 硬链接文件有两个限制:
      1. 不允许给目录创建硬链接;
      2. 只有在同一文件系统中的文件之间才能创建链接。

     

    例6-15设计一个程序,要求为“/etc/passwd”文件建立软链接“6-15link”,并查看此链接文件和“/etc/passwd”文件。

    源程序代码:

     

    思考题:设计一个程序,要求为“/bin”目录文件建立软链接为“bin”,并查看此链接文件和“/bin”目录文件。

    6-16设计一个程序,要求为“/etc/passwd”文件建立软链接“6-16link”,并查看此链接文件和“/etc/passwd”文件。

     

    源程序代码:

    思考题:设计一个程序,要求为“/bin/ls”文件建立硬链接为“ls”,并查看此链接文件和“/bin/ls”文件。

    思考与实验

    1. 设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件,权限设置为只有所有者有只读权限。

    1. 设计一个程序,要求新建一个文件“hello”,利用write函数将“Linuxc软件设计”字符串写入该文件。

    1. 设计一个程序,要求利用read函数读取系统文件“/etc/passwd”,并在终端中显示输出。

    1. 设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件;读取系统文件“/etc/passwd”,把文件中的内容都写入“pass”文件。

    1. 设计一个程序,要求将10分别以十进制、八进制和十六进制输出。

    1. 设计一个程序,要求新建一个目录,预设权限为-x--x--x--

    1. 设计一个程序,要求为“/bin/ls”文件建立一个软链接“ls1”和一个硬链接为“ls2”,并查看两个链接文件和“/bin/ls”文件。

    心得体会

    写C语言程序的时候,虽然相对来说熟悉,遇到了相当多的问题,可是越写到后面,才知道我犯的错误是多么小,虽然一开始编译很多错误,但实际上就是空格和中英文符号的错误,以及有些程序缺少头文件,我就纳闷了,为什么输入输出语句里面只要还有双引号,就得用中文双引号,这跟我之前学的常识不太一样,所以在这种小问题上浪费了很久的时间。

    展开全文
  • MFC 六大机制 (1) MFC程序的初始化

    千次阅读 2016-06-17 15:14:23
    MFC六大机制之一(也成为MFC六大关键技术) MFC程序的初始化 本章将先介绍 MFC 的文档/视图结构,讲解实现该结构的数据结构,然后编写一个控制台应用程序来模拟 MFC 的初始化,理清 MFC 初始化的顺序,然后说明如何...
    本章将先介绍 MFC 的文档/视图结构,讲解实现该结构的数据结构,然后编写一个控制台应用程序来模拟 MFC 的初始化,理清 MFC 初始化的顺序,然后说明如何创建一个最基本的 MFC 应用程序。

    MFC 最重要的结构 文档/视图结构

    MFC 提供了构造Windows应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列启动文件,还提供标准的图形用户界面如菜单、工具栏、状态条等供开发人员在程序中补充完善,开发人员只需要完成针对待定应用的代码即可。其中最重要的框架就是其于文档/视图结构的文档应用程序框架。
    在文档/视图结构中,程序的数据储存在文档类中(作为文档类的数据成员),文档类是对数据的抽象表示。数据显示由视图负责,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显示在窗口,用户通过视图与程序交互。
    文档,视图和框架三者之间是相互关联,相互协调的,彼此都包含了指向对方的指针。文档、视图与框架的关系,如下图所示:




    MFC文档/视图结构相关的类

    一般情况下,采用文档/视图结构的应用程序至少应由以下对象组成:应用程序对象(CWinApp类派生的对象),框架窗口对象(CFrameWnd类派生的对象),文档对象(CDocument类派生的对象),视图对象(CView类派生的对象)。另外,还必须有一个负责管理文档和视图的文档模板类(CDocTemplate)。其中的主角是CDocument类(文档类)和 CView类(视图类),这就是文档/视图结构的由来。各类的作用分别介绍如下:

    1.CWinApp

    CwinApp (应用程序类) 提供了用户与 Windows 应用程序之间进行交流的界面。在实例化该类对象后,这个对象自动地把自身与 Widnows 系统建立联系,接收 Windows 传送的消息,并交给程序中相应的对象去处理,免去了程序员许多的工作,使得开发 Windows 序变得简单方便。
    这个类中有一个重要的成员函数:InitInstance(),在 Windows 环境下,可以运行同一程序的多个实例,函数 InitInstance() 的作用是在生成的一个新的实例的时候,完成一些初始化的工作。另外还有一个函数InitApplication(),与前者的区别是它"每一个程序只调用一次",而 InitInstance() 是"每一个例程调用一次"。

    2.CFrameWnd

    CFrameWnd (框架窗口类) 是应用程序的框架窗口。所谓框架窗口是指包括菜单、工具栏、状态栏和窗口客户区的整个应用程序的主窗口,相当于简单应用程序框架中所提到的主窗口。在 MFC 程序中,一般并不需要经常对 CFrameWnd 类进行操作,更多的是对视窗类进行操作,达到对程序中的数据进行编辑的目的。

    3.CView

    CView (视图类) 派生于 Cwnd 类,用于管理文档/视图结构中的窗口客户区,这个窗口在文档/视图结构中称为视图。视图类专门用于对应用程序的数据进行显示,在视图类中有一个很重要的函数 OnDraw(),OnDraw()函数是用于进行应用程序数据显示的函数,一般在派生类中要重写这一个函数。在文档/视图结构中,重写的OnDraw()函数首先清空客户区窗口,然后再在窗口上绘制客户需要的内容,也就是说,OnDraw() 函数将集中管理所有的数据显示工作。

    4.CDocument

    CDocument (文档类) 虽然视图类负责应用程序数据的显示,但应用程序的数据一般不直接由视图类管理,而是作为文档类(CDocument)的数据成员,由文档类来进行集中管理,而且文档类将直接与磁盘相联系,把文档类中的数据存盘,或从磁盘中取出存盘的数据。视图类用 OnDraw() 函数展示数据,但应用程序的数据却存放在文档类中,视图类的函数 GetDocument() 的返回值就是指向文档类的指针,通过这个指针就可以访问 到文档类中的公有数据成员。文档类的数据要存盘或取盘要与磁盘进行数据传递,可以用 CFile 类结合CFileDialog 类实现。在文档/视图结构中,通过文档类中的序列化函数 Serialize() 就可以很简单的完成数据存取任务。文档/视图结构中,数据的传输过程如下图所示:



    5.CDocTemplate

    CDocTemplate(文档模板类)的作用是连接文档/视图结构中文档类,视图类和框架窗口类之间的关系,文档类,视图类和框架窗口类之间的关系是在文档模板类中建立起来的,同时文档模板类还加载了菜单以及与菜单资源使用的 ID 等资源。具体来说,在 CWinApp 派生类的 InitInstance() 函数中建立了文档模板类 CDocTemplate,并用文档模板类连接资源、框架窗口、文档和视图。

    类层次结构


    继承类图,左边为父类,右边为派生类。实线框中的类只有 CObject 在 "afx.h" 中,其余都在 "afxwin.h" 中,虚线框中全部是用户自己定义的派生类。

    使用控制台程序模拟 MFC 初始化

    注意!是使用控制台应用程序(Win32 Console Application)模拟而不是 MFC 程序!另外不用急着 copy 代码,我在文章底部附录一给出了代码下载链接和使用方法。

    假设新建一个控制台应用程序叫"My",首先自然是编写上面五个重要类的派生类,其中 CDocTemplate  用于管理其他类的对象,可以被直接使用,这里就暂且不讨论了(它的派生类被声明在"afxwin.h"中)。于是创建四个头文件并声明其他类的派生类。

    //My.h
    class CMyApp : public CWinApp
    {
    public:
    	CMyApp();
    	virtual BOOL InitInstance();    //覆盖
    };
    //MyDoc.h
    
    class CMyDoc : public CDocument
    {
    public :
    	CMyDoc();
    };
    //MyFrame.h
    
    class CMyFrame : public CFrameWnd
    {
    public:
    	CMyFrame();
    };
    //MyView.h
    
    class CMyView : public CView
    {
    public:
    	CMyView();
    };

    这就是客户需要创建的所有头文件了,当你使用 IDE 创建一个 MFC 程序时,他会自动为你创建上述头文件。另外还需要注意下面这 3 个头文件,它们在 MFC 类库中是真实存在的,并且名称相同。"afx.h" 声明了 CObject 基类,"afxwin.h" 声明了 MFC 中使用的大部分类的基类,"stdafx.h" 是为了减少重复编译设置的,用于建立一个预编译的头文件 .PCH 和一个预定义的类型文件 STDAFX.OBJ。由于MFC体系结构非常大,包含许多头文件,如果每次都编译的话比较费时,因此我们把常用的 MFC头 文件都放在 stdafx.h 中,如 afxwin.h、afxext.h、afxdisp.h、afxcmn.h 等,然后让 stdafx.cpp 包含这个 stdafx.h 文件。这样,由于编译器可以识别哪些文件已经编译过,所以stdafx.cpp就只编译一次,并生成所谓的预编译头文件。

    //stdfx.h
    
    #include "afxwin.h"
    
    //其他必要的头文件
    //#include <......>
    //#include <......>
    //#include <......>
    
    //链接必要的库
    //#pragma comment(......)
    //#pragma comment(......)
    //#pragma comment(......)

    //afxwin.h
    
    #pragma once
    #include "afx.h"
    
    //CCmdTarget类声明
    class CCmdTarget : public CObject
    {
    public:
    	CCmdTarget();
    };
    
    //CDocument类声明
    class CDocument : public CCmdTarget
    {
    public:
    	CDocument();
    };
    
    //CWnd类声明
    class CWnd : public CCmdTarget
    {
    public:
    	CWnd();
    	virtual BOOL Create();
    	BOOL CreateEx();
    	virtual BOOL PreCreateWindow();
    };
    
    //CFrameWnd类声明
    class CFrameWnd : public CWnd
    {
    public:
    	CFrameWnd();
    };
    
    //CView类声明
    class CView : public CWnd
    {
    public:
    	CView();
    };
    
    //CWinThread类声明
    class CWinThread : public CCmdTarget
    {
    public:
    	CWnd* m_pMainWnd;
    
    	CWinThread();
    	virtual BOOL InitInstance();
    	virtual int Run();
    };
    
    //CWinApp类声明
    class CWinApp : public CWinThread
    {
    public:
    	CWinApp();
    	virtual BOOL InitApplication();
    	virtual BOOL InitInstance();    //覆盖
    	virtual int Run();    //覆盖
    };

    说明几点,CWnd 类中有创建窗口的虚函数,Create,CreateEx(前者的扩展版本),PreCreateWindow。 因此实际编写其派生类时需要覆盖这些函数。CWinApp 中有重要的 InitApplication() 函数和继承自 CWinThread 的 InitInstance() 和 Run(),编写其派生类通常要覆盖它们。值得一提的是,CWinThread 有一个数据成员 CWnd* m_pMainWnd,它是指向框架窗对象的指针。

    //afx.h
    
    //演示需要,MFC实际上不包含<iostream>
    #include <iostream>
    using namespace std;
    
    //实际上下面这些重定义写在<WinDef.h>中,MFC编程时通常会自动包含该头文件,为演示方便就写这了
    typedef int BOOL;
    #define TRUE 1;
    
    //CObect类声明
    class CObject
    {
    public:
    	CObject();
    };

    "afx.h" 中声明了祖宗类 CObject。

    好了,至此为止,已经完成了所有头文件的创建,接下来只需要编写它们对应的 .cpp 文件即可。处于演示需要,我们在所有类的构造函数中加上一句输出方便运行时查看。

    首先是四个客户类的实现:

    //MyDoc.cpp
    
    #include "stdafx.h"
    #include "MyDoc.h"
    
    CMyDoc::CMyDoc()
    {
    	cout<<"CMyDoc Constructor."<<endl;
    }
    //MyFrame.cpp
    
    #include "stdafx.h"
    #include "MyFrame.h"
    
    //CMyFrame类方法定义
    CMyFrame::CMyFrame()
    {
    	cout<<"CMyFrame Constructor."<<endl;
    }
    //MyView.cpp
    
    #include "stdafx.h"
    #include "MyView.h"
    
    //CMyView类方法定义
    CMyView::CMyView()
    {
    	cout<<"CMyView Constructor."<<endl;
    }
    //My.cpp
    
    #include "stdafx.h"
    #include "My.h"
    #include "MyFrame.h"
    #include "MyDoc.h"
    #include "MyView.h"
    
    //CMyWinApp类方法定义
    CMyApp::CMyApp()
    {
    	cout<<"CMyApp Constructor."<<endl;
    }
    BOOL CMyApp::InitInstance()    //覆盖
    {
    	cout<<"CMyApp::InitInstance()."<<endl;
    	
    	//下面的注释为 MFC 源码中的内容,使用RTTI实例化了CMyDoc、
    	//CMyFrame、CMyView,并且使用 CDocTemplate 类来连接管理
    	/*
    	// 注册应用程序的文档模板。文档模板
    	// 将用作文档、框架窗口和视图之间的连接
    	CSingleDocTemplate* pDocTemplate;
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CMyDoc),
    		RUNTIME_CLASS(CMyFrame),       // 主 SDI 框架窗口
    		RUNTIME_CLASS(CMyView));
    	if (!pDocTemplate)
    		return FALSE;
    	AddDocTemplate(pDocTemplate);
    	*/
    
    	this->m_pMainWnd = new CMyFrame();
    	return TRUE;
    }
    
    //全局变量
    CMyApp theApp;
    
    int main()
    {
    	theApp.InitApplication();
    	theApp.InitInstance();
    	theApp.Run();
    	return 0;
    }

    说明几点,InitInstance() 中的注释是 MFC 中的源码,我在这里贴出来是为了让大家理解 MFC 是在这个时候实例化了 CMyDoc、CMyFrame 和 CMyView,至于 RUNTIME_CLASS 是什么,下几章博客会详细介绍。

    为什么 MFC 没有 WinMain()?

    注意!最重要的东西来了!"My.cpp" 中有一个很关键的全局对象 CMyApp theApp,它是整个 MFC 初始化的关键。由于 C++ 中全局对象的构建将比程序进入点(DOS 环境为 main,Windows 为 WinMain)更早,因此 CMyApp 的构造函数最先被执行,完成一系列的初始化。注意到该演示程序里有 main() 函数,但是 MFC 程序中并没有(Window 程序主函数其实是 WinMain()),那么它去哪了呢?MFC 将 WinMain() 封装了起来,在 CMyApp theApp 实例化后会自动调用 WinMain() 函数并获得 theApp 对象的指针对其操作,让使用者看起来 theApp 才是程序的入口点。

    然后是剩余的存在于MFC中 .cpp 文件:
    //stdfx.cpp
    
    #include "stdafx.h"
    //afx.cpp
    
    #include "afx.h"
    
    //CObject类声明
    CObject::CObject()
    {
    	cout<<"CObject Constructor."<<endl;
    }
    //afxwin.cpp
    
    #include "afxwin.h"
    
    //这里导入"CMyApp.h"是为了使用 theApp 全局变量以使用改造版的 AfxGetApp()
    #include "My.h"
    extern CMyApp theApp;
    
    //CCmdTarget类方法定义
    CCmdTarget::CCmdTarget()
    {
    	cout<<"CCmdTarget Constructor."<<endl;
    }
    
    //CDocument类方法定义
    CDocument::CDocument()
    {
    	cout<<"CDocument Constructor."<<endl;
    }
    
    //CWnd类方法定义
    CWnd::CWnd()
    {
    	cout<<"CWnd Constructor."<<endl;
    }
    BOOL CWnd::Create()
    {
    	cout<<"CWnd::Create()."<<endl;
    	return TRUE;
    }
    BOOL CWnd::CreateEx()
    {
    	cout<<"CWnd::CreateEx()."<<endl;
    	return TRUE;
    }
    BOOL CWnd::PreCreateWindow()
    {
    	cout<<"CWnd::PreCreateWindow()."<<endl;
    	return TRUE;
    }
    
    //CFrameWnd类方法定义
    CFrameWnd::CFrameWnd()
    {
    	cout<<"CFrameWnd Constructor."<<endl;
    }
    
    //CView类方法定义
    CView::CView()
    {
    	cout<<"CView Constructor."<<endl;
    }
    
    //CWinThread类方法定义
    CWinThread::CWinThread()
    {
    	cout<<"CWinThread Constructor."<<endl;
    }
    BOOL CWinThread::InitInstance()
    {
    	cout<<"CWinThread::InitInstance()."<<endl;
    	return TRUE;
    }
    int CWinThread::Run()
    {
    	cout<<"CWinThread::Run()."<<endl;
    	return 1;
    }
    
    //CWinApp类方法定义
    CWinApp::CWinApp()
    {
    	cout<<"CWinApp Constructor."<<endl;
    }
    BOOL CWinApp::InitInstance()
    {
    	cout<<"CWinApp::InitInstance()."<<endl;
    	return TRUE;
    }
    BOOL CWinApp::InitApplication()
    {
    	cout<<"CWinApp::InitApplication()."<<endl;
    	return TRUE;
    }
    int CWinApp::Run()
    {
    	cout<<"CWinApp::Run()."<<endl;
    	return 1;
    }

    值得注意的是 InitInstance() 虚函数是在 CWinThread 中被声明,InitApplication() 则是在 CWinApp中被声明。

    呼!大功告成!运行结果如下,可以从结果看一下 MFC 的初始化流程:
    运行结果:
    CObject Constructor.
    CCmdTarget Constructor.
    CWinThread Constructor.
    CWinApp Constructor.
    CMyApp Constructor.
    CWinApp::InitApplication().
    CMyApp::InitInstance().
    CObject Constructor.
    CCmdTarget Constructor.
    CWnd Constructor.
    CFrameWnd Constructor.
    CMyFrame Constructor.
    CWinApp::Run().

    简单总结一下 MFC 的初始化过程:

    最先初始化全局对象 theApp,在 theApp 的 InitInstance() 函数中完成初始化,包括框架窗口类、视图类、文档类(和文档模板类),然后通过消息机制让这些类的对象进行通讯,需要注意的是这些类的继承层次。

    创建一个 MFC 工程

    接下来就要创建一个真正的 MFC 程序并与上面的模拟 MFC 进行对比了,创建方法在文章底部附录二。那么 如何查看 "afxwin.h" 和 "afx.h" 呢?举个例子,你可以双击"My.cpp"将鼠标移到 CMyApp 上右键->转到定义即可方便地跳转到相应位置了。相应现在应该能对这一堆文件有一个大致的定位了。



    附录一:使用已有代码创建 MyMFC


    文件->新建->Visual C++ ->Win32->Win32控制台应用程序 修改名称为 MyMFC


    单击下一步,选择[空项目],单击确定。
    打开你的工程目录(如果不知道在哪,单击文件->最近的文件即可看到),进入MyMFC,再进入MyMFC,将所有代码拷贝至当前位置。(代码在文章底部有下载链接)


    在[解决方案资源管理器]界面中右键头文件->添加->现有项,找到代码拷贝的位置,将所有头文件添加进工程。(按住Ctrl键可多选) 源文件也同样操作。




    双击 My.cpp 编译(Ctrl+F7),运行(Ctrl+F5)。

    附录二:创建MFC工程

    文件->新建->Visual C++ ->MFC->MFC应用程序,将名称改为:My ->确定


    选择 ·单个文档 ·在静态库中使用MFC


    单击 [下一步] 直到 [生成的类] 这一界面,单击 CMainFrame,将类名/文件名修改为 MyFrame(为了形式统一)


    单击完成

    注意!需先在[解决方案资源管理器]中打开 stdafx.cpp 进行编译(Ctrl+F7),再打开 My.cpp 进行编译,才可运行(Ctrl+F5),否则会报错。(因为需要先导入 stdafx.h 中的内容) 运行结果如下所示(已经关闭了无关窗口)。


    注意!如果程序报错:[无法打开包括文件:“MainFrm.h”: No such file or directory] 是因为VS修改文件名出了点小问题,很简单,双击该错误,将[#include "MainFrm.h"]修改为[#include "MyFrame.h"]重新编译即可。
    展开全文
  • 我们知道有JAVA功能的手机程序包括应用程序,游戏和电子书等等),主要都是由两个文件组成,一个是*.JAR,一个是*.JAD。下面给大家讲解一下他们的主要性质和信息JAR文件包含这个程序的Java类,以及有关的其他文件...

    我们知道有JAVA功能的手机程序(包括应用程序,游戏和电子书等等),主要都是由两个文件组成,一个是*.JAR,一个是*.JAD。

    下面给大家讲解一下他们的主要性质和信息JAR文件包含这个程序的Java类,以及有关的其他文件诸如图像和应用程序数据(即通常所说的资源等信息)。JAR文件下的manifest.mf是描述JAR内容的清单文件,这也是跟我们玩家有关的信息,在这里重点介绍。至于其他的信息是程序开发者关心的,就不多说了。

    manifest.mf文件所有可能的信息如下:

    MIDlet-Name ---MIDlet程序包的名称。

    MIDlet-Version --MIDlet的版本号

    MIDlet-Vendor -----MIDlet的创建者或提供商

    MIDlet-Icon ---------应用程序管理器把这个图标与 MIDlet-Name相关联,这是一个图形文件,以 PNG图象格式储存。

    MIDlet-Description -----描述 MIDlet的文本
    MIDlet-Info-URL -----可能提供更多MIDlet和/或供应商信息的 URL MIDlet- 这个属性包括三段信息:
        MIDlet名称 /用于这个 MIDlet的图标(可选) /应用程序管理器将调用来加载这个MIDlet的类名
       MIDlet-Jar-URL---- JAR文件的 URL MIDlet-Jar-Size ----JAR文件的大小
        MIDlet-Data-Size---- 持久数据存储必需的最小字节数

    MicroEdition-Profile ----MIDlet需要哪一种 J2ME简表 MicroEdition-Configuration----- MIDlet需要哪一种 J2ME配置上面这些属性并不是全部都需要的,但是,下面列出的这六个是必须的,否则应用程序管理器就会拒绝加载这个JAR。
       MIDlet-Version
       MIDlet-Name
       MIDlet-Vendor
       MIDlet-
       MicroEdition-Profile
       MicroEdition-Configuration


    下面我们讲解JAD文件:有些程序是不需要这个文件的,这些程序在传送的过程中不需要修改JAR文件。

    但是我们的60系统则只需要自动安装,系统会自动生成JAD的文件~~~“古墓丽影”游戏的JAD文件清单:我们看到JAD的属性与manifest.mf文件里的属性是相同的,但是下面的属性必须要有,否则手机无法加载这个游戏:
       MIDlet-Version MIDlet-Name
       MIDlet-Vendor
       MIDlet-
       MIDlet-Jar-URL ----引用jar文件!!!!!!!!!
       MIDlet-Jar-Size
    这里要说明的是:除了这些属性以外,如果两个文件中的另外名称相同的属性,但是属性值不相同的,将优先采取应用程序描述器文件 ( JAD )属性!我们看到上面有一个 MIDlet-1 属性,这个属性不是必须的,但是没有这个属性,在模拟器中将没有办法使用这个程序!

    因此,如果你的手机程序无法在模拟器中使用的话,可以添加一下这个属性,再试试看到底可不可以运行。还要注意的几点是:

    1。属性MIDlet-Name、MIDlet-Version和MIDlet-Vendor 既在 JAR中的清单文件中又在 JAD文件中,这些属性的值都必须完全相同。
    2。属性 MIDlet-Data-Size在JAR文件和 JAD文件中都有,当两个文件中都定义了这个属性的时候,程序运行时JAD文件中的属性将使用。
    3。MIDP(Mobile Information Device Profile)移动信息设备简表,提供一种标准的运行时环境,允许在终端用户设备上动态地配置新的应用程序和服务。

    MIDlet是遵照MIDP编写的java应用程序,MIDlet是定位于提供某种水平的网络连接性的移动设备。运行 MIDlet的设备也有好几个共同的属性:有限的屏幕大小,内存和处理能力,这个规范是设计来满足这些需求,典型的设备包含行动电话和呼叫器。

     


    该文章转自[灵通163-LT163.com] 原文链接:http://www.lt163.com/sj/jcpc/syjs/200810/3983.html

    展开全文
  • 程序文档预览、文件缓存

    千次阅读 2018-12-08 17:37:51
    一、技术摘要 文件下载(wx.downloadFile) 文档预览(wx.openDocument) 文件本地存储(wx.saveFile)...使用文件下载功能需要先在微信后台进行下载域名配置,具体操作请移步官方文档,下载文件时,需要调用wx.do...

    一、技术摘要

    • 文件下载(wx.downloadFile)
    • 文档预览(wx.openDocument)
    • 文件本地存储(wx.saveFile)
    • 获取本地存储的文件(wx.getSavedFileList)
    • 文档分享(ios暂不支持,Android需要借助第三方文档工具)

    二、文件下载

    使用文件下载功能需要先在微信后台进行下载域名配置,具体操作请移步官方文档,下载文件时,需要调用wx.downloadFile()方法,其中的两个参数最为重要

    • API wx.downloadFile()
    • url->文件存放的服务器地址
    • filePath->文件存放的本地地址(默认是存储到本地临时文件,离开即会删除)
      在这里插入图片描述

    三、文档预览

    官方目前支持大部分格式的文档预览,包括常用的PDF,Word,PPT,(Excel目前暂不支持)

    • API wx.openDocument()
    • filePath->文件路径(本地和下载得到的临时路径都可以)
    • fileType->(当前文件的类型)在这里插入图片描述

    四、文件存储

    文件存储分为临时存储和本地存储,其中最大的区别就是文件分别存在的周期长短,但是需要注意的是用户如果删除当前小程序,那么对应的文件也会被删除,(文件存储不管是临时还是本地存储,文件大小总共不能超过10M,一旦超过,再次调用相关API,会一直走fail错误回调方法)

    • tempFilePath->存储的路径(返回本地的存储路径,请注意此时返回的是一个数组列表,包含了文件的大小、文件路径、文件存储的初始时间)

    对于Android文件下载之后文件后缀变为unknown的解决办法是在地址后面拼接一个对应文档后缀名
    https://google.com?fileType=.pdf(地址是乱写的哈,主要用于展示)
    https://google.com?fileType=.word(地址是乱写的哈,主要用于展示)

    五、获取本地存储的文件
    当文件保存到了本地,那么在下次进入就需要进行文件列表的获取,此时获取文件分两种状态

    • 获取指定的某一个单独的文件详细信息(wx.getSavedFileInfo)
      * 需要传入访问的文件路径
      * 返回的结果是包含当前文件的存储时间和大小
    • 获取本地缓存的所有文件信息(wx.getSavedFileList)
      * 不需要传递参数
      * 返回的结果是当前本次存储的所有文件(文件大小、路径、时间)

    在这里插入图片描述

    六、文档分享

    通过实践操作,发现在打开文档的窗口下只有Android可以进行当前文档的分享(Android默认打开的页面是通过QQ浏览器进行预览的),但是分享出去之后,发现文件缺失了对应的后缀,导致被分享人打开不了文档的问题,
    暂时解决方法

    • 文件分享之后,接受文档的用户手动添加后缀名
    • 通过第三方文件(wps)打开进行分享

    对于ios不能打开的问题,目前官方是不支持,具体可以访问下面链接进行查看
    https://developers.weixin.qq.com/community/develop/doc/000e2c2b37c940261a47032e758c00

    七、code

    //wxml
    <view class='downloadView'>
      <block wx:for="{{storeFile}}" wx:key="*this">
        <view class='itemsView' data-info="{{storeFile[index]}}" bindtap='openStoreFile'>打开本地缓存的第{{index+1}}个文件</view>
      </block>
      <!-- 下载文件 -->
      <button data-type='0' bindtap='fileDownload'>临时文件下载并打开</button>
      <button data-type='1' bindtap='fileDownload'>存储文件下载</button>
    </view>
    
    
    //wxss
    .downloadView{
      width:100%;
    }
    .itemsView{
      line-height:60rpx;
      font-size:26rpx;
      margin-bottom:10rpx;
      border-bottom:1rpx solid #ccc;
    }
    button{
      border-bottom:1rpx solid red;
      border-radius:0;
    }
    
    //js
    Page({
      data: {
        storeFile: null,
      },
      onShow: function () {
        let that = this;
        wx.getSavedFileList({
          success(res) {
            that.setData({
              storeFile: res.fileList
            })
            console.log(that.data.storeFile)
            console.log('本地缓存文件获取成功',res)
          },
          fail(error) {
            console.log('本地缓存文件获取失败', error);
          }
        })
      },
    
      // 文件下载
      fileDownload: function (e) {
        let type = e.currentTarget.dataset.type;
        if (type == 0) {
          this.download(0);
        } else {
          this.download(1);
        }
      },
    
      // 文件下载
      download:function(val){
        let that = this;
        let filePath = '';
        that.showLoad();
    
        //下载
        wx.downloadFile({
          url: '下载地址',
          filePath: filePath,
          success(res) {
            that.showLoadHid();
            filePath = res.tempFilePath
            console.log('临时文件地址', filePath)
            if(val==0){//临时存储并打开
              that.fileOpen(filePath)
            }else{//存储本地
              wx.saveFile({
                tempFilePath: res.tempFilePath,
                success(res) {
                  that.data.storeFile.push(res.tempFilePaths);
                  that.setData({
                    storeFile: that.data.storeFile
                  })
                  console.log(that.data.storeFile)
                  console.log('文件存储成功');
                },
                fail(error) {
                  console.log('本地文件存储失败');
                }
              })
            }
          },
          fail(error) {
            that.showLoadHid();
            console.log('文件下载失败', error)
          }
        })
      },
      // 本地文档打开
      openStoreFile:function(e){
        let info = e.currentTarget.dataset.info;
        console.log(info);
        this.fileOpen(info.filePath);
      },
    
      // 打开文档
      fileOpen:function(val){
        wx.openDocument({
          filePath: val,
          fileType: 'pdf',
          success(res){
            console.log('打开文件成功');
          },
          fail(error){
            console.log('文件打开失败');
          }
        })
      },
      showLoad:function(){
        wx.showLoading({
          title: '文件下载中',
          mask:true,
        })
      },
      showLoadHid:function(){
        wx.hideLoading();
      }
    })
    
    展开全文
  • 程序应该包括下列部分:  package语句,该部分至多只有一句,必须放在源程序的第一句。  import语句,该部分可以有若干import语句或者没有,必须放在所有的类定义之前。  public classDefinition,公共类...
  • 把JAVA程序转化为EXE安装程序文件

    千次阅读 2007-11-11 11:32:00
    关于将java程序做成exe文件的几种做法: 可以把普通的Java程序做成真正的exe,也就是单一个exe就可以在没有安装JVM的机器上运行。这样的工具常见的有JET和gcj.前者是收费的,而且做出来的exe还是需要一堆dll。推荐使用...
  • 将Python程序打包成可执行文件exe

    千次阅读 2017-06-10 12:24:45
    Python编程语言是一款功能强大的免费开源的通用型计算机程序应用语言,对于经验丰富的开发人员来说,掌握这样一款语言在其程序开发中是一个比较重要的选择。我们今天就先来了解一下python打包方法的相关应用。   ...
  • 【维生素C语言】第十章 - 文件操作(上)

    千次阅读 多人点赞 2021-08-15 16:07:50
    本章为文件操作教学上篇,由浅入深的引入问题,然后逐一介绍知识。将详细讲解文件的打开和关闭、文件的顺序读写并精讲函数部分,初步学习“流”的概念!
  • 近期正在做在Ubuntu环境下将C++程序封装成动态库文件和静态库文件,期间不知道掉了多少坑,在这里写下来以免忘记工作是将实现MTCNN的C++源代码封装成动态库文件和静态库文件,原先在github上找到了一个依据opencv和...
  • 一、概述 在实际的软件开发项目中,经常需要处理大量的文件。某些文件包含了相当多的数据记录数,如作者本人参与过的项目中,一个文件中有好几十万条记录。...本文介绍分批读取文件中数据的程序流程,并给出了C程
  • windows自动运行程序文件自动传输

    千次阅读 2012-02-07 14:40:10
    一、文件的自动传输  假如在计算机A中,每天会产生一些很重要的数据文件,为了预防计算机A由于系统崩溃造成这些重要数据文件的丢失,每天需要将这些重要... 1、在计算机A的windows操作系统下,建立批处理程序文件f
  • java开发六大基本原则

    万次阅读 多人点赞 2017-11-27 10:12:49
    设计模式之六大原则(转载)  关于设计模式的六大设计原则的资料网上很多,但是很多地方解释地都太过于笼统化,我也找了很多资料来看,发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂,因此转载过来。 ...
  • 简述在 Qt 之 WAV文件解析 中给出了WAV文件属性的计算,具体包括文件大小、音频时长、比特率等属性,这里我们再次验证一下这些属性值的计算 。在计算之前,我们要知道一下wav文件中的三个参数 采样频率、音频通道数...
  • 设计模式的六大原则

    万次阅读 多人点赞 2019-05-16 17:50:03
    用来描述环境和数据的数据,通俗的说就是配置参数,参数可以从文件中获得,也可以从数据库中获得。 第三:制定项目章程   在一个团队中,建立项目章程是非常重要的,因为章程是所有开发人员都必须遵守的约定,...
  • 程序的几种常用格式文件

    千次阅读 2017-10-20 10:08:36
    int global; int calculate() { int a,b,c;... }一、编译把每个函数翻译成可以运行的机器指令,但其中调用的函数和全局变量因为还没有分配具体的物理地址,所以会先保留其符号,main函数编译后的
  • 、ANDROID资源文件

    千次阅读 2011-06-10 11:13:00
    1、 资源包括:文本字符串、图像和图标、音频文件、视频和其他应用程序使用的组件。2、 在Android工程中,Android资源文件是同Java类文件分开存储的,大多数常见的资源类型存储在XML中。你也可以将原始数据文件和...
  • CHM帮助文件在VB程序中的应用

    千次阅读 2005-12-21 15:26:00
    CHM帮助文件在VB程序中的应用――HTML Help Workshop作 者:叶帆(http://blog.csdn.net/yefanqiu)一.工欲利其事,必先利其器――CHM制作之工具1. 首推微软门下的专门工具HTML Help Workshop,它是制作chm帮助文件最...
  • CMake 是一个跨平台的自动化建构系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要...
  • JSP六大标识详解

    千次阅读 2019-01-01 22:33:53
    指令标识在客户端是不可见的, 在之前写服务器的文章中, 我就强调过, 服务器的一功能就是执行浏览器请求的动态页面, 比如ASP页面, JSP页面。然后最终是生成HTML页面,再返回给浏览器。 所以我们可知, 像这些...
  • 工作年对一个程序员意味什么?在职位上:高级开发工程师?架构师?技术经理?or … ?在能力上:各种编码无压力?核心代码无压力?平台架构无压力? or … fuck?看着这些问号都心累。那么,年你迷惘了吗?又走...
  • Android六大界面布局

    千次阅读 2016-10-10 16:04:13
    Android六大界面布局方式: 声明Android程序布局有两种方式: 1) 使用XML文件描述界面布局; 2) 在Java代码中通过调用方法进行控制。 我们既可以使用任何一种声明界面布局的方式,也可以同时使用两...
  • c语言程序实例大全!(包含220个程序实例)

    千次下载 热门讨论 2011-03-01 19:08:00
    文件包含200多个C语言的实例,共分为8个部分,可以对大家理解C语言的应用起到很好的帮助,目录清单大致如下: 第一部分 基础篇, 第二部分 数据结构篇 第三部分 数值计算与趣味数学篇 第部分 常见试题解答篇 第...
  • 如何把JAVA程序封装成EXE文件

    万次阅读 2009-09-19 10:32:00
    可以把普通的Java程序做成真正的exe,也就是单一个exe就可以在没有安装JVM的机器上运行。这样的工具常见的有JET和gcj.前者是收费的,而且做出来的exe还是需要一堆dll。推荐使用gcj.他有windows和Linux版,直接下载zip...
  • 程序可以全部生成静态页面! 有利于SEO哦! 后台admin 密码123456 演示地址:www.63ba.cn (要是觉得是AD话 就请版主屏蔽掉吧) ...程序包含了全部数据 压缩后程序大小为216M(不包括生成的静态文件)
  • 内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfs、proc文件系统,加载了磁盘驱动程序驱动程序等。接下来,内核跳转到用户空间的init程序,由init完成创建磁盘设备文件、加载磁盘...
  • 面向对象的六大原则

    千次阅读 2019-02-13 18:36:34
    我们知道,面向对象是一种编程思想,包括三大特性和六大原则,其中,三大特性指的是封装、继承和多态;六大原则指的是单一职责原则、开闭式原则、迪米特原则、里氏替换原则、依赖倒置原则以及接口隔离原则,其中,...
  • GNU tools 开发ARM 程序及生成映象文件机理杜云海( duyunhai@hotmail.com ,(wwww.seajia.com)在我的ARM 学习报告001 中,用了一个简单的MySComm4510b程序,对ARM 系统的映象文件的生成和执行过程做了一个很初浅...
  • 三、Google breakpad简单介绍四、Google breakpad实现原理简单了解五、在Qt工程中集成Breakpad实现跨平台异常捕获、qBreakpad的编译方法七、各平台下的例子工程下载地址 一、崩溃捕捉记录的意义 应用程序发布...
  • VS2010/MFC中的文件

    2015-01-22 14:02:58
    解决方案相关文件 解决方案相关文件包括解决方案文件夹下面的 .sln文件、.sdf文件、.suo文件和.ipch文件。 .sln----solution ...工程相关文件包括工程文件夹下面的.vcproj等,它包含当前工程的设置和
  • 文件正在被另一个人或程序使用原因一:文件正在使用中 在删除文件时,经常会遇到的一个问题是,文件正在使用,无法删除。如果试图删除以独占访问而不是以共享访问方式打开,并且正在使用中的文件时,系统就会出现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 332,789
精华内容 133,115
关键字:

六大程序文件包括哪些