Windows 上の C++ は、フォルダー内のすべての画像とサブファイルを走査して転送し、プログラムを exe 実行可能ファイルにパッケージ化します。


序文

最近、データ収集を容易にするために、工場内の各フォルダおよびそのサブフォルダ内の写真を一つのフォルダにまとめてアップロードする必要があり、その機能をC++で実現しています。


1. 機能実現

1. ファイルとそのサブフォルダーの下にある画像をたどり、そのパスをコンテナーに入れます

Windows での操作は次のとおりです。コードは次のとおりです。

//遍历文件夹
void finddir(string dirpath,vector<string>&files){
    
    
	//文件句柄 
	//intptr_t  hFile = 0;
	long long  hFile = 0;
	//文件信息 
	struct _finddata_t fileinfo; //文件信息读取结构
	string p; //string类很有意思的一个赋值函数:assign(),有很多重载版本
	if ((hFile = _findfirst(p.assign(dirpath).append("\\*").c_str(), &fileinfo)) != -1)
	{
    
    
		do
		{
    
    
			if ((fileinfo.attrib & _A_SUBDIR)) //判断是否为文件夹
			{
    
    
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
    
    
					finddir(p.assign(dirpath).append("\\").append(fileinfo.name), files);//递归当前文件夹
				}
			}
			else  //文件处理
			{
    
    
				//cout << fileinfo.name << endl;
				string filename = fileinfo.name;
				string suffix = filename.substr(filename.find_last_of(".") + 1);
				//cout << suffix << endl;
				if (suffix == "jpg") {
    
    
					files.push_back(p.assign(dirpath).append("\\").append(fileinfo.name));//文件名

				}
			}
		} while (_findnext(hFile, &fileinfo) == 0); //寻找下一个,成功返回0,否则-1
		_findclose(hFile);
	}

}

2. フォルダーを作成する

ここでの機能は保存されたファイルパスが存在するかどうかを判断するものであり、自動作成はありません。コードは次のとおりです。

//创建文件夹
void createDir(string path) {
    
    
	if (_access(path.c_str(), 0) == -1) {
    
    
		_mkdir(path.c_str());
	} //判断文件夹是否存在,不存在则自动创建
}

3. ファイルを転送する

画像を指定したディレクトリに移動し、

//移动文件
bool move_file(string imgpath1, string imgpath2) {
    
    
	//imgpath1:原先路径
	//imgpath2:要转移的路径
	BOOL flag = MoveFile(imgpath1.c_str(), imgpath2.c_str()); //若imgpath2不存在会返回0
	return flag;

4. 通話コード

int main()
{
    
    
	string dirpath = "";//待转移目录
	if (_access(dirpath.c_str(), 0) == -1) {
    
    
		cout << "该目录不存在" << endl;
	}
	vector<string> file_list;
	finddir(dirpath,file_list);
	//cout << "finished" << endl;

	string save_path = "";//目标目录
	createDir(save_path);

	//转移文件
	clock_t s,e;
	s = clock();
	for (int i = 0; i < file_list.size(); i++) {
    
    
		string imgname = file_list[i].substr(file_list[i].find_last_of("\\")+1);
		//cout << file_list[i] << ",\t"<<save_path + "\\" + imgname << endl;
		move_file(file_list[i], save_path + "\\" + imgname);
	}
	e = clock();
	double total_time = double(e - s) / CLOCKS_PER_SEC;
	cout << "Total time:" << total_time <<"s" << endl;
	
}

5. 必要なヘッダー ファイル

#include <iostream>
#include <vector>
#include <string>
#include<io.h>  //必不可少
#include<direct.h>
#include<fstream>
#include <Windows.h>
#include <ctime>
#include <cstdlib>
using namespace std;

2、パッケージexe

1. 拡張機能のインストール

ここで使用するツールは Microsoft Visual Studio Installer Project です. インストール方法は次のとおりです. 個人的には 2 番目の方法をお勧めします:
(1): VS の [ツール] -> [拡張機能と更新] -> [オンライン] を選択し、直接検索します。図に示すように:
ここに画像の説明を挿入

ここに画像の説明を挿入
インストールされている場合、緑色の枠内に表示されている部分が私のものと同じになります。個人的には、この方法はお勧めしません。現実には遅すぎるからです。ホットスポットのインストールに置き換えるという提案もあります。私はこれを試したことはありませんが、興味のある友人は試してみてください。
(2)、ダウンロードした拡張機能 (Xunlei をお勧めします)、ダブルクリックしてインストールを実行します。公式 Web サイトのリンクは次のとおりです。Microsoft Visual Studio インストーラー プロジェクト
バージョンは、使用する VS のバージョンと一致している必要があることに注意してください。

2. 実行可能ファイルの生成

ここでは主にこの偉い人の記事を参考にします. この記事は非常に詳細であり, 写真とテキストの両方が含まれています. 途中で問題はありません. リンクは次のとおりです: 梱包プログラム


要約する

以上がこの記事の全内容ですが、私も C++ の初心者レベルですので、ご不明な点がございましたら、ご指摘ください。

おすすめ

転載: blog.csdn.net/qq_55068938/article/details/127733162