实习随手记-文件系列操作

文件基础练习

1.创建目录

2.创建文件

3.查询目录和文件属性

4.遍历文件夹,并输出所有文件的属性

5.拷贝目录和文件

6.剪切目录和文件

7.删除目录和文件

<程序写的时候用了DOS的相关命令,被骂了>

/*=================================================
1.创建目录 ***
2.创建文件
3.查询目录和文件属性
4.遍历文件夹,并输出所有文件的属性//http://blog.jobbole.com/109303/ 
5.拷贝目录和文件
6.剪切目录和文件
7.删除目录和文件
===================================================*/
#include<io.h>
#include <stdlib.h> //调用shell命令来进行文件相关的操作
#include <stdio.h>




#include<string.h> 
#include <iostream>  
#include<string>
#include <windows.h>  
#include <direct.h>  
using namespace std;


//目录的建立
void DocumentCreat()
{
char filename[30], filename2[35];
printf("请输入目录:\n");
scanf("%s", filename);
if (_access(filename, 0))//判断目录是否存在
{
sprintf(filename2, "md %s", filename);
system(filename2); //system("md 目录名")。system函数的原型是int system(char *command); 这注明了里面只能存在一条系统命令,而不能是有变量
printf("\n创建成功!");
}
else
{
printf("目录已经存在!");
}

}
//目录的删除
void DocumentDelete()
{


char filename[30], filename2[35];
printf("请输入要删除的目录:\n");
scanf("%s", filename);
if (_access(filename, 0))//判断目录是否存在
{
printf("\n目录不存在");
}
else
{
sprintf(filename2,"rd/S/Q %s", filename);// "rd/S/Q %s"命令除目录本身外, 还将删除指定目录下的所有子目录和文件.用于删除目录树
system(filename2);
printf("\n删除成功!");
}


}
//建立文件
void FileCreat()
{
char filename[30];
char filepath[30];
char file[100];
FILE *fp;
//printf("\n先输入文件,再输入路径:");
printf("\n文件名: "); scanf("%s", filename);
//printf("\n添加到目录: "); scanf("%s", filepath);
sprintf(file, "%s", filename);
fp = fopen(file, "w");
if (fp == NULL)
{
printf("\n文件:%s创建失败 \n", file);
return;
}
fclose(fp);
}
//删除文件
void FileDelete()
{
char filename[30], filename2[35];
printf("请输入要删除的文件:\n");
scanf("%s", filename);
if (_access(filename, 0))//判断目录是否存在
{
printf("\n文件不存在");
return;
}
else
{
remove(filename);
printf("\n删除成功!");
}


}


//深度遍历目录文件
void BrowseDocFile(string path, int layer)
{

_finddata_t file_info;
string current_path = path + "/*.*"; //  也可以用/*来匹配所有  
int handle = _findfirst(current_path.c_str(), &file_info);


//返回值为-1则查找失败  
if (-1 == handle)
{
cout << "无法遍历该目录" << endl;
return;
}


do
{
//判断是否子目录  
if (file_info.attrib == _A_SUBDIR)
{
//递归遍历子目录 



for (int i = 0; i < layer; i++)
{
cout << "=>";//打印记号反映出深度层次  
}
cout << " [目录] "<<file_info.name << endl;


int layer_tmp = layer;
if (strcmp(file_info.name, "..") != 0 && strcmp(file_info.name, ".") != 0)  //[.是当前目录],[..是上层目录],必须排除掉这两种情况  
BrowseDocFile(path + '/' + file_info.name, layer_tmp + 1); //再windows下可以用\\转义分隔符,不推荐  
}
else
{
//打印记号反映出深度层次  
for (int i = 0; i<layer; i++)
cout << "--";
cout <<" [文件] " <<file_info.name << endl;
}
} while (!_findnext(handle, &file_info));  //返回0则遍历完  
 
_findclose(handle); //关闭文件句柄  
printf("\n任意键继续:");
getchar();


}
void Traverse()
{
string namepath;
int layernume = 0;
cout << "输入遍历的目录:";// 此处路径连接符只能用 / ,根盘符大小写都行
cin >> namepath;
BrowseDocFile(namepath, layernume);
}




//粘贴文件
void CopyFile(string infile,string outfile)
{
FILE *in, *out;
char ch;
char pin[30], pout[30];
strcpy(pin, infile.c_str());//这是为了string和char*型的获取  https://zhidao.baidu.com/question/1382412488844707980.html?fr=iks&word=string%BA%CDchar%2A&ie=gbk
strcpy(pout, outfile.c_str());//


if ((in = fopen(pin, "r")) == NULL)
{
printf("cannot open infile!\n");
exit(0);
}
if ((out = fopen(pout, "w")) == NULL)
{
printf("cannot open outfile!\n");
exit(0);
}
while (!feof(in))
{
ch = fgetc(in);
if (ch == EOF)
break;
fputc(ch, out);


}


fclose(in);
fclose(out);
}
//粘贴目录
void CopyDoc(string frompath, string topath )
{
_finddata_t file_info;
string current_path = frompath + "/*"; //  也可以用/*来匹配所有  
int handle = _findfirst(current_path.c_str(), &file_info);


//返回值为-1则查找失败  
if (-1 == handle)
{
cout << "无法找到该目录" << endl;
return;
}


do
{
//判断是子目录  
if (file_info.attrib == _A_SUBDIR)
{
//建立对应位置的目录
char filename1[50], filename2[60];
char buff[50];
strcpy(buff, topath.c_str());//得到目标路径


sprintf(filename1, "%s\\%s", buff, file_info.name);
sprintf(filename2, "md %s", filename1);
system(filename2);//把目录添加到目标路径


//递归遍历子目录 
if (strcmp(file_info.name, "..") != 0 && strcmp(file_info.name, ".") != 0)  //[.是当前目录],[..是上层目录],必须排除掉这两种情况  
CopyDoc(frompath + '\\' + file_info.name, topath+'\\'+ file_info.name); //再windows下可以用\\转义分隔符,不推荐  

}
//是文件  
else
{
//复制文件
string s1 = frompath + '\\' + file_info.name;
string s2 = topath + '\\' + file_info.name;
CopyFile(s1, s2);
}
} while (!_findnext(handle, &file_info));  //返回0则遍历完  


_findclose(handle); //关闭文件句柄  
}




//复制
void Copy()
{
string infile,outfile,outfile1;
char  buff[50];
char outpath[40];
cout << "复制的原目录: ";
cin>>infile;
cout << endl;
cout << "复制的目标地址: ";
cin>>outfile;


const char *ptr;
ptr = strrchr(infile.c_str(), '\\'); ;//p是path里最后一个'\\'的地址。然后
string s(ptr + 1); //s就是当前路径的目录名  "===== "。
outfile1 = outfile + '\\' + s;
strcpy(outpath, outfile1.c_str());//得到目标路径


sprintf(buff, "md %s", outpath);
system(buff);//在目标路径下创建拷贝的目录


CopyDoc(infile, outfile1);


}


//剪切
void shear()
{
string infile, outfile, outfile1;
char  buff[50];
char outpath[40],inpath[40];
char shear[50];
cout << "剪切的原目录: ";
cin >> infile;
cout << endl;
cout << "粘贴的目标地址: ";
cin >> outfile;


const char *ptr;
ptr = strrchr(infile.c_str(), '\\'); ;//p是path里最后一个'\\'的地址。然后
string s(ptr + 1); //s就是当前路径的目录名  "===== "。
outfile1 = outfile + '\\' + s;
strcpy(outpath, outfile1.c_str());//得到目标路径


sprintf(buff, "md %s", outpath);
system(buff);//在目标路径下创建拷贝的目录
CopyDoc(infile, outfile1);


strcpy(inpath, infile.c_str());//得到原路径
sprintf(shear,"rd/S/Q %s", inpath);// "rd/S/Q %s"命令除目录本身外, 还将删除指定目录下的所有子目录和文件.用于删除目录树
system(shear);//删除原目录


}


int sysmenu()
{
int num;
char ch;
system("cls");
printf("=========================");
printf("\n1.创建目录");
printf("\n2.删除目录");
printf("\n3.建立文件");
printf("\n4.删除文件");
printf("\n5.遍历目录树");
printf("\n6.复制目录树");
printf("\n7.剪切目录树");
printf("\n8.结束\n");
while (scanf("%d", &num) != 1 || num>8 || num<1)            //获取整数
{
while (ch = getchar() != '\n');
printf("请输入选择:");
}
return num;
}




void main() 
{
system("cls");
while (1)
{
switch (sysmenu()) //登陆主界面操作
{
case 1:DocumentCreat(); break;
case 2:DocumentDelete(); break;
case 3:FileCreat(); break;
case 4:FileDelete(); break;
case 5:Traverse(); break;
case 6:Copy(); break;
case 7:shear(); break;
case 8:return;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值