编写程序,实现文件拷贝功能。程序运行时,通过控制台接受用户输入两个参数,即源文件和目标文件,命令格式如下: cp.exe source.file destination.file 提示: 1)以二进制形式操作文件,对于源文件使用ios_base::_Nocreate方式,表示不新建文件(文件不存在则出错),对于目标文件使用ios_base::_Noreplace方式,表示不覆盖文件(文件已存在则出错)。 2)循环读取文件时,最后一次读取读到文件尾,通常不会恰好填满缓冲区,可以通过ifstream::gcount()获取刚才读取的字节数。 3)int main(int argc, char **argv)可以让程序获取用户输入的参数。 运行效果如下:D :\ tmp>cp . exe exl . obj out . dat File copied : exl . obj D:\ tmp >输出两个文件的属性页面
时间: 2024-02-13 13:03:08 浏览: 93
好的,以下是 C++ 的代码:
```cpp
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main(int argc, char **argv) {
if (argc != 3) { // 用户输入参数不足两个,输出提示信息
cout << "Usage: " << argv[0] << " source.file destination.file" << endl;
return 0;
}
ifstream source(argv[1], ios_base::binary | ios_base::in | ios_base::_Nocreate); // 打开源文件
if (!source) { // 源文件打开失败,输出提示信息
cout << "Cannot open source file: " << argv[1] << endl;
return 0;
}
ofstream dest(argv[2], ios_base::binary | ios_base::out | ios_base::_Noreplace); // 打开目标文件
if (!dest) { // 目标文件打开失败,输出提示信息
cout << "Cannot create destination file: " << argv[2] << endl;
return 0;
}
char buffer[1024]; // 缓冲区
while (!source.eof()) { // 循环读取源文件
source.read(buffer, 1024);
dest.write(buffer, source.gcount()); // 将读取的字节数写入目标文件
}
source.close(); // 关闭源文件
dest.close(); // 关闭目标文件
cout << "File copied: " << argv[1] << endl; // 输出提示信息
// 获取源文件和目标文件的属性
WIN32_FILE_ATTRIBUTE_DATA source_attr, dest_attr;
if (GetFileAttributesExA(argv[1], GetFileExInfoStandard, &source_attr) &&
GetFileAttributesExA(argv[2], GetFileExInfoStandard, &dest_attr)) {
// 输出源文件和目标文件的属性
cout << "Source file attributes:" << endl;
cout << " File size: " << source_attr.nFileSizeLow << endl;
cout << " Creation time: " << ctime(&source_attr.ftCreationTime.tv_sec);
cout << " Last access time: " << ctime(&source_attr.ftLastAccessTime.tv_sec);
cout << " Last write time: " << ctime(&source_attr.ftLastWriteTime.tv_sec);
cout << "Destination file attributes:" << endl;
cout << " File size: " << dest_attr.nFileSizeLow << endl;
cout << " Creation time: " << ctime(&dest_attr.ftCreationTime.tv_sec);
cout << " Last access time: " << ctime(&dest_attr.ftLastAccessTime.tv_sec);
cout << " Last write time: " << ctime(&dest_attr.ftLastWriteTime.tv_sec);
}
return 0;
}
```
你可以将代码保存为 `cp.cpp` 文件,然后使用以下命令编译:
```
g++ -o cp.exe cp.cpp
```
接着,你就可以使用 `cp.exe` 命令来拷贝文件并输出文件属性了,例如:
```
cp.exe exl.obj out.dat
```
上面的命令会将 `exl.obj` 文件拷贝到 `out.dat` 文件中,同时输出 `File copied: exl.obj` 和源文件和目标文件的属性。
阅读全文