Windows の ProgramData フォルダにはまった

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

ドライブに対してこのプログラムを実行するととても時間がかかります…。

投稿者について
みのしす

小さいときは科学者になろうとしたのに、その時にたまたま身に着けたプログラミングで未だに飯を食っているしがないおじさんです。(年齢的にはもうすぐおじいさん)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です