zoukankan      html  css  js  c++  java
  • 二进制文件读写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
    

      

  • 相关阅读:
    大话设计模式总结(28种设计模式定义+简单理解)
    Dbank网盘下载地址提取ASP
    C#特性详解
    wcf大文件传输解决之道(1)
    WCF完美搭建android平台服务之一
    堆栈和委托堆的区别(c#)一
    wcf完美搭建android平台服务之三
    liunx简单命令集合
    WCF完美搭建android平台服务之二
    WCF中常用的binding方式比较
  • 原文地址:https://www.cnblogs.com/mathyk/p/9327998.html
Copyright © 2011-2022 走看看