開発環境 Visual C++ 2015
実行環境 Windows 10 Home 64bit
プロジェクトの種類 Win32 Console Application
プロジェクト名 filedup
追加のオプション Empty project

filedup.cpp
#include <fcntl.h>	// _O_WTEXT
#include <io.h>		// _setmode
#include <stdio.h>	// _fileno
#include <stdlib.h>
#include <map>
 
typedef struct {
	std::wstring name;
	time_t write;
} fileinfo_t;
 
// 関数プロトタイプ宣言
int loadsrc(const wchar_t *fname);
int loaddst(const wchar_t *fname);
 
// 外部変数
std::multimap<_fsize_t, fileinfo_t> m;
 
int wmain(int argc, wchar_t *argv[])
{
	_setmode(_fileno(stdout), _O_WTEXT);
	_setmode(_fileno(stderr), _O_WTEXT);
 
	if (argc != 3) {
		fwprintf(stderr, L"usage: filedup src.csv dst.csv\n");
		return 1;
	}
 
	loadsrc(argv[1]);
	loaddst(argv[2]);
 
	return 0;
}
 
int loadsrc(const wchar_t *fname)
{
	FILE *pf;
	errno_t err = _wfopen_s(&pf, fname, L"rt,ccs=UNICODE");
	if (err) {
		fwprintf(stderr, L"error: ファイルのオープンに失敗しました。[%s]\n", fname);
		exit(1);
	}
 
	wchar_t dir[_MAX_PATH];
	wchar_t name[_MAX_PATH];
	_fsize_t size;
	time_t create;
	time_t write;
	int count = 0;
	while (true) {
		int ret = fwscanf_s(pf, L"%[^,],%[^,],%lu,%llu,%llu%*c",
			dir, _countof(dir), name, _countof(name), &size, &create, &write);
		if (ret != 5) break;
 
		m.emplace(size, fileinfo_t {name, write});
		count++;
	}
 
	fwprintf(stderr, L"loadsrc完了 %d\n", count);
	fclose(pf);
	return 0;
}
 
int loaddst(const wchar_t *fname)
{
	FILE *pf;
	errno_t err = _wfopen_s(&pf, fname, L"rt,ccs=UNICODE");
	if (err) {
		fwprintf(stderr, L"error: ファイルのオープンに失敗しました。[%s]\n", fname);
		exit(1);
	}
 
	wchar_t dir[_MAX_PATH];
	wchar_t name[_MAX_PATH];
	_fsize_t size;
	time_t create;
	time_t write;
	int count = 0;
	while (true) {
		int ret = fwscanf_s(pf, L"%[^,],%[^,],%lu,%llu,%llu%*c",
			dir, _countof(dir), name, _countof(name), &size, &create, &write);
		if (ret != 5) break;
 
		bool flag = true;
		auto p = m.equal_range(size);
		for (auto it = p.first; it != p.second; it++) {
			if (it->second.write == write && it->second.name == name) {
				flag = false;
				break;
			}
		}
		if (flag) {
			wprintf(L"%s%s\n", dir, name);
		}
		count++;
	}
 
	fwprintf(stderr, L"loaddst完了 %d\n", count);
	fclose(pf);
	return 0;
}
 
最終更新:2016年11月15日 10:45