#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;
}