Windows の下には色々なフォルダがありますが、ProgramData の下にある Application Data は自身にループしてリンクされています。(きっと歴史的な経緯なんだろうな。) 何も考えないでファイルをコピーするとリンクをたどってしまい、コピーが先に進みません。
同じような構造が “Documents and Settings” や “Users\All Users” にもあり、最終的には ProgramData のリンクに集まってきます。
また OneDrive を使っていたり、Temp を使っている場合はそのフォルダはコピー時は無視していいはずなので、コピー対象から除外します。そのほかにも WSL 関連のバーチャルディスクも必要がありません。
コピープログラムは大体以下のような形になると思います。
BOOL makeCopy(const wstring &parent, const wstring &dst) {
set<wstring> extName;
wstring exWords[] = { TEXT(".."), TEXT("OneDrive"), TEXT("Temp"), TEXT("ext4.hdxl") }:
for (int i = 0; i < sizeof(wstring)/sizeof(TCHAR); i += 1) {
exName.insert(exWords[i]);
}
WIN32_FIND_DATA fdata;
set<wstring> dirSet;
HWND hnd = FindFirstFile(parent.c_str(), &fdata);
if (hnd != INVALID_HANDLE) {
do {
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (wstring(TEXT(".")) != ffd.cFileName) {
dirSet.insert(ffd.cFileName);
}
} else if (ffd.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) {
// ファイルコピー
MyCopyFile(parent + TEXT("\\") + ffd.cFileName, dst + TEXT("\\") + ffd.cFileName);
}
} while (FindNextFile(hDir, &ffd));
FindClose(hnd);
} else {
return FALSE;
}
// フォルダ作成
BOOL r = TRUE;
for (auto dir : dirSet) {
wstring parentNew = parent + TEXT("\\") + dir;
wstring dstNew = dst + TEXT("\\") + dir;
MyCreateDirectory(dstNew);
// 子フォルダを再帰でコピー
r &= makeCopy(parentNew, dstNew);
}
return TRUE;
}
ドライブに対してこのプログラムを実行するととても時間がかかります…。
コメントを残す