zoukankan      html  css  js  c++  java
  • (六)文件管理

    文件管理的试题比较多,主要就是模拟操作系统中的 建立文件、打开文件、读文件、写文件、、关闭文件、 、删除文件、、建立目录、、
    显示目录内容、显示文件内容、、改变文件属性等操作。大家可以参考书本253页的上机指导。

    北大2001年试题:
    建立一个树型文件目录
    假设程序启动运行后在根目录下且根目录为空。

    实习检查:
    1、运行程序,由检查教师给出文件名,该文件中存有相应的若干命令。(程序应做提示,界面友好)。
    2、要求实现两个命令:
    mkdir 目录名(目录已存在,应给出错误信息。)
    cd 目录名(目录不存在,应给出错误信息。)
    3、你所编制的程序应读入文件,并执行其中的每一条命令。
    4、在屏幕上显示文件目录的结构。(界面自己设计,但要清晰明了。)

    2002年北京大学的试题:
    操作系统上机考试题
    题目:模拟文件系统
    要求:模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些
    基本操作。
    假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录
    名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。普通文件可以
    只用目录项(FCB)代表。(详细的数据结构见后面的说明)
    程序功能方面的要求:
    需要实现一个命令行操作界面,包含如下命令:
    1 改变目录
    格式:CD〈目录名〉
    功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录
    下的功能,不要求实现相对目录以及绝对目录。
    2 创建文件
    格式:CREATE〈文件名〉〈文件长度〉
    功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必
    须能输入文件长度。
    3 删除文件
    格式:DEL〈希望删除的文件名〉
    功能:删除指定的文件
    4 显示目录
    格式:LSALL
    功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
    图示如图。
    5 创建目录
    格式:MD〈目录名〉
    功能:在当前路径下创建指定的目录
    6 删除目录
    格式:RD〈目录名〉
    功能:删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否
    作删除,删除操作将该目录下的全部文件和子目录都删除。
    对于上述功能要求,完成1-4为及格,完成1-5为良,完成1-6为优。

    程序实现方面的要求:
    1 对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误*
    作情况,程序应该作出相应处理并给出错误信息,但是程序不得因此而退出。
    2 界面友好,程序强壮。
    3 界面的提示符为#,提示的命令以及调试的方法应和前面的要求一致。不要自己设计命
    令或者附加不要求的功能。
    4 在考卷的说明部分(背面)有一段程序的源代码以及对源代码的说明,考试的编码应
    在这个程序的基础上修改而成。这段源代码中规定了文件系统使用的数据结构和需要实
    现的函数框架,请将你的实现代码填写到合适的位置中去,可以自己添加辅助数据结构、
    变量、常量以及函数,但是不得改变已有的代码(如数据结构的定义以及函数的名称以
    及参数说明)。
    5 考试提交的源程序请命名为filesys.c。
    6 程序设计环境使用TC2.0,在DOS操作系统下完成全部程序代码。

    本程序包括实现:

    1 改变目录
    格式:CD〈目录名〉
    功能:工作目录转移到指定的目录下,只要求完成改变到当前目录的某一个子目录
    下的功能,不要求实现相对目录以及绝对目录。
    2 创建文件
    格式:CREATE〈文件名〉〈文件长度〉
    功能:创立一个指定名字的新文件,即在目录中增加一项,不考虑文件内容,但必
    须能输入文件长度。
    3 删除文件
    格式:DEL〈希望删除的文件名〉
    功能:删除指定的文件
    4 显示目录
    格式:LSALL
    功能:显示全部目录以及文件,输出时要求先输出接近根的目录,再输出子目录。
    图示如图。
    5 创建目录
    格式:MD〈目录名〉
    功能:在当前路径下创建指定的目录
    6 删除目录
    格式:RD〈目录名〉

    文件管理
    #include<stdio.h>
    #include
    <string.h>
    #include
    <iostream.h>
    #include
    <math.h>
    #include
    <stdlib.h>
    #include
    <iomanip.h>

    // ******************目录和文件的结构定义******
    typedef struct node{
    char name[50]; /*目录或文件的名字*/
    int type; /*0代表目录,1代表普通文件*/
    struct node *next; /*指向下一个兄弟结点的指针*/
    struct node *sub; /*指向第一个子结点的指针*/
    struct node *father; /*指向父结点的指针*/

    int size; /*如果是文件则表示文件的大小*/

    }dirNode;

    dirNode
    *workDir; //定义当前工作目录
    dirNode root; //定义根目录

    char path[100]; //定义路径信息

    //初始化函数
    void initial()
    {
    strcpy(root.name,
    "root");
    root.type
    =0;
    root.next
    =NULL;
    root.sub
    =NULL;
    root.father
    =NULL;
    root.size
    =0;

    workDir
    =&root;

    strcpy(path,
    "root");
    }

    //初始化新结点函数
    dirNode *init()
    {
    dirNode
    *p;

    p
    =new dirNode;

    strcpy(root.name,
    "");
    root.type
    =0;
    root.next
    =NULL;
    root.sub
    =NULL;
    root.father
    =NULL;
    root.size
    =0;

    return p;
    }

    //1 改变目录
    void CD(char dirName[])
    {
    dirNode
    *p;
    int flag=0;

    p
    =workDir->sub;
    if(p==NULL){
    cout
    <<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
    }
    else{
    while(p){
    if(p->type==0){
    if(!strcmp(p->name,dirName)){
    flag
    =1;
    break;
    }
    }
    p
    =p->next;
    }
    if(flag==1){
    workDir
    =p;
    strcat(path,
    "\\ ");
    strcat(path,p
    ->name);
    cout
    <<"工作目录已进入\""<<dirName<<"\""<<endl;
    }
    else{
    cout
    <<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
    }
    }
    }

    //2 创建文件
    void CREATE(char fileName[],int fileSize)
    {
    int flag;
    dirNode
    *p,*q;

    q
    =new dirNode;
    strcpy(q
    ->name,fileName);
    q
    ->sub=NULL;
    q
    ->type=1;
    q
    ->next=NULL;
    q
    ->father=workDir;
    q
    ->size=fileSize;

    p
    =workDir->sub;

    if(p==NULL){
    workDir
    ->sub=q;
    cout
    <<"\""<<fileName<<"\"文件创建成功"<<endl;
    }
    else{
    flag
    =0;
    while(p){
    if(p->type==1){
    if(!strcmp(p->name,fileName)){
    flag
    =1;
    cout
    <<"错误,\""<<fileName<<"\"文件已存在"<<endl;
    }
    }
    p
    =p->next;
    }
    if(flag==0){
    p
    =workDir->sub;
    while(p->next){
    p
    =p->next;
    }
    p
    ->next=q;
    cout
    <<"\""<<fileName<<"\"文件创建成功"<<endl;
    }
    }
    }

    //3 删除文件
    void DEL(char fileName[])
    {
    dirNode
    *p,*q;
    int flag=0;

    p
    =workDir->sub;
    if(p==NULL){
    cout
    <<"错误,\""<<fileName<<"\"文件不存在"<<endl;
    }
    else{
    while(p){
    if(p->type==1){
    if(!strcmp(p->name,fileName)){
    flag
    =1;
    break;
    }
    }
    p
    =p->next;
    }
    if(flag==1){
    if(p==workDir->sub){
    workDir
    ->sub=p->next;
    }
    else{
    q
    =workDir->sub;
    while(q->next!=p){
    q
    =q->next;
    }
    q
    ->next=p->next;
    delete p;
    }
    cout
    <<"\""<<fileName<<"\"文件已删除"<<endl;
    }
    else{
    cout
    <<"错误,\""<<fileName<<"\"文件不存在"<<endl;
    }
    }

    }

    //4 显示所有目录

    //显示本目录下所有兄弟目录和文件
    void dir(dirNode *p)
    {
    while(p){
    if(p->type==0){
    cout.setf(
    2);
    cout
    <<setw(14)<<p->name<<setw(12)<<"<DIR>"<<endl;
    }
    else{
    cout.setf(
    2);
    cout
    <<setw(14)<<p->name<<setw(12)<<"<FILE>"<<setw(10)<<p->size<<endl;
    }
    p
    =p->next;
    }
    }
    //
    void dirs(dirNode *p,char str[])
    {
    char newstr[100];
    dirNode
    *q;
    cout
    <<str<<"下子目录及文件:"<<endl;
    dir(p);

    q
    =p;
    if(q->sub){
    strcpy(newstr,
    "");
    strcat(newstr,str);
    strcat(newstr,
    "\\");
    strcat(newstr,q
    ->name);

    dirs(q
    ->sub,newstr);
    }
    q
    =p;
    while(q->next){
    if(q->next->sub){
    strcpy(newstr,
    "");
    strcat(newstr,str);
    strcat(newstr,
    " \\");
    strcat(newstr,q
    ->next->name);

    dirs(q
    ->next->sub,newstr);
    }
    q
    =q->next;
    }
    }

    // 显示所有目录
    void LSALL()
    {
    dirNode
    *p;

    cout
    <<"显示所有目录结构"<<endl<<"--------------------------------------------"<<endl;

    p
    =root.sub;

    dirs(p,
    "root");


    }
    //5 创建目录
    void MD(char dirName[])
    {
    int flag;
    dirNode
    *p,*q;

    q
    =new dirNode;
    strcpy(q
    ->name,dirName);
    q
    ->sub=NULL;
    q
    ->type=0;
    q
    ->next=NULL;
    q
    ->father=workDir;
    q
    ->size=0;

    p
    =workDir->sub;

    if(p==NULL){
    workDir
    ->sub=q;
    cout
    <<"\""<<dirName<<"\"子目录创建成功"<<endl;
    }
    else{
    flag
    =0;
    while(p){
    if(p->type==0){
    if(!strcmp(p->name,dirName)){
    flag
    =1;
    cout
    <<"错误,\""<<dirName<<"\"子目录已存在"<<endl;
    }
    }
    p
    =p->next;
    }
    if(flag==0){
    p
    =workDir->sub;
    while(p->next){
    p
    =p->next;
    }
    p
    ->next=q;
    cout
    <<"\""<<dirName<<"\"子目录创建成功"<<endl;
    }
    }
    }

    //6 删除目录
    void RD(char dirName[])
    {
    /*
    删除当前目录下的指定目录,如果该目录为空,则可删除,否则应提示是否
    作删除,删除操作将该目录下的全部文件和子目录都删除

    这题目有点问题,因为CD只要求完成改变到当前目录的某一个子目录
    下的功能,不要求实现相对目录以及绝对目录。所以不进入子目录是不可能在子目录下再建子目录或文件的。
    因此只要实现删除工作目录的子目录就可以了,不要去管“如果该目录为空,则可删除,否则应提示是否
    作删除,删除操作将该目录下的全部文件和子目录都删除”。
    */
    dirNode
    *p,*q;
    int flag=0;

    p
    =workDir->sub;
    if(p==NULL){
    cout
    <<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
    }
    else{
    while(p){
    if(p->type==0){
    if(!strcmp(p->name,dirName)){
    flag
    =1;
    break;
    }
    }
    p
    =p->next;
    }
    if(flag==1){
    if(p==workDir->sub){
    workDir
    ->sub=p->next;
    }
    else{
    q
    =workDir->sub;
    while(q->next!=p){
    q
    =q->next;
    }
    q
    ->next=p->next;
    delete p;
    }
    cout
    <<"\""<<dirName<<"\"子目录已删除"<<endl;
    }
    else{
    cout
    <<"错误,\""<<dirName<<"\"子目录不存在"<<endl;
    }
    }


    }

    //显示版权信息函数
    void version()
    {
    cout
    <<endl<<endl;

    cout
    <<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
    cout
    <<" ┃     模拟文件管理模拟系统        ┃"<<endl;
    cout
    <<" ┠───────────────────────┨"<<endl;
    cout
    <<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
    cout
    <<" ┃      sony006@163.com          ┃"<<endl;
    cout
    <<" ┃     version 2004 build 1122      ┃"<<endl;
    cout
    <<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;

    cout
    <<endl<<endl;
    }

    void main()
    {
    int len,fileSize,flag,comm;

    char string[50];
    char command[10];
    char name[40];
    char *s,*s1;

    version();

    initial();


    flag
    =1;
    while(flag){
    cout
    <<endl<<" 模拟文件管理模拟系统"<<endl;
    cout
    <<endl<<"CD 改变目录 CREATE 创建文件 DEL 删除文件 "<<endl<<"LSALL 显示目录 MD 创建目录 RD 删除目录"<<endl<<"exit 退出"<<endl;
    cout
    <<endl<<"-----------------------------------------------"<<endl;
    printf(
    "%s:>#",path);

    gets(
    string);
    len
    =strlen(string);

    if(len==0){
    strcpy(command,
    "errer");
    }
    else{
    //获得命令
    s=NULL;
    s
    =strchr(string,' ');
    if(s!=NULL){
    *s='\0';
    }
    strcpy(command,
    string);

    //测试命令类型
    if((!strcmp(command,"CD"))||!strcmp(command,"cd")){
    comm
    =1;
    }
    else{
    if((!strcmp(command,"CREATE"))||!strcmp(command,"create")){
    comm
    =2;
    }
    else{
    if((!strcmp(command,"DEL"))||!strcmp(command,"del")){
    comm
    =3;
    }
    else{
    if((!strcmp(command,"LSALL"))||!strcmp(command,"lsall")){
    comm
    =4;
    }
    else{
    if((!strcmp(command,"MD"))||!strcmp(command,"md")){
    comm
    =5;
    }
    else{
    if((!strcmp(command,"RD"))||!strcmp(command,"rd")){
    comm
    =6;
    }
    else{
    if((!strcmp(command,"EXIT"))||!strcmp(command,"exit")){
    comm
    =0;
    }
    else{
    comm
    =100;
    }
    }
    }
    }
    }
    }
    }
    switch(comm){
    case 1:
    //1 改变目录
    strcpy(name,s+1);
    CD(name);
    break;
    case 2:
    //2 创建文件
    s1=strchr(s+1,' ');
    *s1='\0';
    strcpy(name,s
    +1);
    fileSize
    =atoi(s1+1);
    CREATE(name,fileSize);
    break;
    case 3:
    //3 删除文件
    strcpy(name,s+1);
    DEL(name);
    break;
    case 4:
    //4 显示目录
    LSALL();
    break;
    case 5:
    //5 创建目录
    strcpy(name,s+1);
    MD(name);
    break;
    case 6:
    //6 删除目录
    strcpy(name,s+1);
    RD(name);
    break;
    case 0:
    //0 退出系统
    flag=0;
    break;
    default:
    cout
    <<"命令错误"<<endl;
    }
    }
    }
    }
  • 相关阅读:
    IIS是如何处理ASP.NET请求的
    数据库访问性能优化
    通信交互总结
    数据库集群技术漫谈
    VS2010中出现无法嵌入互操作类型
    正则表达式-更新版
    IIS部署SSL证书后提示不可信的解决方案
    CSS水平居中和垂直居中解决方案
    jQuery get/post区别及contentType取值
    配置Tomcat使用https协议
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1896360.html
Copyright © 2011-2022 走看看