二进制文件读写rb与rb+

二进制的文件读写 rb与 rb+

rb:为输入打开一个二进制文件; 

rb+ 指为读写打开一个二进制文件;

rb为只读,对于不需要进行更新的文件,可以防止用户的错误的写回操作,防止损毁原有数据。具有较高的安全性~~~
rb+为更新二进制文件,可以读取,同时也可以写入,需要用到fseek之类的函数进行配合,以免出错~~~
FILE* fp = nullptr;
const char* fname = "../test.h264";
fp = fopen(fname, "rb+");
if(!fp)
{
  std::cout<<"打开文件失败!"<<endl;
}

  

#ifndef COPYDIR_H
#define COPYDIR_H

#include <string>
#include <vector>

class CopyDir
{
public:
	CopyDir();
	~CopyDir();
	void copy(const std::string& srcDirPath, const std::string& desDirPath);

public:

private:
	bool make_dir(const std::string& pathName);
	//bool mkdir (char const* pathname/*, mode_t mode*/);
	bool get_src_files_name(std::vector<std::string>& fileNameList);
	void do_copy(const std::vector<std::string>& fileNameList);

private:
	std::string srcDirPath, desDirPath;
};

#endif // COPYDIR_H

  

#include "copy_dir.h"
#include <iostream>
#include <fstream>
#include <cstring>
#pragma warning(disable: 4996)

#if defined(_WIN32)
#   include <direct.h>
#   include <io.h>
#   include <shlobj.h>
#   include <sys/stat.h>
#   include <sys/types.h>
#else // Linux
#   include <dirent.h>
#   include <unistd.h>
#   include <sys/stat.h>
#   include <sys/types.h>
#   include <pwd.h>
#endif

CopyDir::CopyDir()
{

}

CopyDir::~CopyDir()
{

}

void CopyDir::copy(const std::string& srcDirPath, const std::string& desDirPath)
{
	this->srcDirPath = srcDirPath;
	std::string srcDir;
#ifdef _WIN32
	int n = 0;
	while (srcDirPath.find('\', n) != std::string::npos)
	{
		n = srcDirPath.find('\', n) + 1;
	}
	if (n == 0)
	{
		std::cout << "src path error" << std::endl;
		return;
	}
	srcDir = srcDirPath.substr(n - 1, srcDirPath.size());

#else  // Linux
	int n = 0;
	while (srcDirPath.find('/', n) != std::string::npos)
	{
		n = srcDirPath.find('/', n) + 1;
	}
	if (n == 0)
	{
		std::cout << "src path error" << std::endl;
		return;
	}
	srcDir = srcDirPath.substr(n - 1, srcDirPath.size());

#endif
	this->desDirPath = desDirPath + srcDir;

	if (!make_dir(this->desDirPath))
	{
		return;
	}

	std::vector<std::string> fileNameList;
	if (!get_src_files_name(fileNameList))
	{
		return;
	}

	if (fileNameList.empty())
	{
		std::cout << "src dir is empty" << std::endl;
		return;
	}

	do_copy(fileNameList);
}

bool CopyDir::make_dir(const std::string& pathName)
{
	if (access(pathName.c_str(), 0) == -1)  //文件夹不存在则生成一个
	{
		std::cout << pathName << " is not existing" << std::endl;
		std::cout << "now make it" << std::endl;
		#ifdef _WIN32
				if (::_mkdir(pathName.c_str()) < 0)
				{
					std::cout << "create path error" << std::endl;
					return false;
				}
		#else  // Linux
				if (::mkdir(pathName.c_str(), S_IRWXU | S_IRGRP | S_IXGRP) < 0)
				{
					std::cout << "create path error" << std::endl;
					return false;
				}
		#endif
	}
	return true;	
}

bool CopyDir::get_src_files_name(std::vector<std::string>& fileNameList)
{
	#ifdef _WIN32
		_finddata_t file;
		long lf;
		std::string src = this->srcDirPath + "\*.*";
		if ((lf = _findfirst(src.c_str(), &file)) == -1)
		{
			std::cout << this->srcDirPath << " not found" << std::endl;
			return false;
		}
		else{
			while (_findnext(lf, &file) == 0)
			{
				if (strcmp(file.name, ".") == 0 || strcmp(file.name, "..") == 0)
					continue;
				fileNameList.push_back(file.name);
			}
		}
		_findclose(lf);
	#else  // Linux
		DIR *dir;
		struct dirent *ptr;

		if ((dir = opendir(this->srcDirPath.c_str())) == NULL)
		{
			std::cout << this->srcDirPath << " not found" << std::endl;
			return false;
		}

		while ((ptr = readdir(dir)) != NULL)
		{
			if ((ptr->d_name == ".") || (ptr->d_name == ".."))  //current / parent
				continue;
			else if (ptr->d_type == 8)  //file
				fileNameList.push_back(ptr->d_name);
			else if (ptr->d_type == 10)  //link file
				continue;
			else if (ptr->d_type == 4)  //dir
				fileNameList.push_back(ptr->d_name);
		}
		closedir(dir);

	#endif
	return true;
}

void CopyDir::do_copy(const std::vector<std::string> &fileNameList)
{
#pragma omp parallel for
	for (int i = 0; i < fileNameList.size(); i++)
	{
		std::string nowSrcFilePath, nowDesFilePath;
#ifdef _WIN32
		nowSrcFilePath = this->srcDirPath + "\" + fileNameList.at(i);
		nowDesFilePath = this->desDirPath + "\" + fileNameList.at(i);

#else
		nowSrcFilePath = this->srcDirPath + "/" + fileNameList.at(i);
		nowDesFilePath = this->desDirPath + "/" + fileNameList.at(i);

#endif
		std::ifstream in;
		in.open(nowSrcFilePath, std::ios::binary);
		if (!in)
		{
			std::cout << "open src file : " << nowSrcFilePath << " failed" << std::endl;
			continue;
		}

		std::ofstream out;
		out.open(nowDesFilePath, std::ios::binary);
		if (!out)
		{
			std::cout << "create new file : " << nowDesFilePath << " failed" << std::endl;
			in.close();
			continue;
		}

		out << in.rdbuf();

		out.close();
		in.close();
	}
}

  

  

#ifdef _WIN32
	std::string src = "D:\a";
	std::string des = "C:";
	CopyDir cd;
	cd.copy(src, des);
#else
	std::string src = "/media/myUbuntu/F/data/test";
	std::string des = "/media/myUbuntu/F/data/test2";
	CopyDir cd;
	cd.copy(src, des);
#endif

  

原文地址:https://www.cnblogs.com/mathyk/p/9327998.html