Pertanyaan Bagaimana cara membuat folder di direktori home?


Saya ingin membuat direktori path = "$HOME/somedir".

Saya sudah mencoba menggunakan boost::filesystem::create_directory(path), tetapi gagal - rupanya fungsi tidak memperluas variabel sistem.

Bagaimana saya bisa melakukannya dengan cara paling sederhana?

(perhatikan: dalam kasus saya string path adalah konstan dan saya tidak tahu pasti apakah itu mengandung variabel)

sunting: Saya sedang mengerjakan Linux (meskipun saya berencana untuk memport aplikasi saya ke Windows dalam waktu dekat).


7
2018-02-03 19:57


asal


Jawaban:


Menggunakan getenv untuk mendapatkan variabel lingkungan, termasuk HOME. Jika Anda tidak tahu pasti apakah mereka mungkin hadir, Anda harus mem-parsing string mencari mereka.

Anda juga bisa menggunakan shell sistem dan echo untuk membiarkan shell melakukan ini untuk Anda.

Getenv portabel (dari standar C), tetapi menggunakan shell untuk melakukan ini secara portabilitas akan lebih sulit antara * nix dan Windows. Konvensi untuk variabel lingkungan berbeda antara * nix dan Windows juga, tetapi mungkin string adalah parameter konfigurasi yang dapat dimodifikasi untuk platform yang diberikan.

Jika Anda hanya perlu mendukung perluasan direktori rumah daripada variabel lingkungan sembarang, Anda dapat menggunakan ~ konvensi dan kemudian ~/somedir untuk string konfigurasi Anda:

std::string expand_user(std::string path) {
  if (not path.empty() and path[0] == '~') {
    assert(path.size() == 1 or path[1] == '/');  // or other error handling
    char const* home = getenv("HOME");
    if (home or ((home = getenv("USERPROFILE")))) {
      path.replace(0, 1, home);
    }
    else {
      char const *hdrive = getenv("HOMEDRIVE"),
        *hpath = getenv("HOMEPATH");
      assert(hdrive);  // or other error handling
      assert(hpath);
      path.replace(0, 1, std::string(hdrive) + hpath);
    }
  }
  return path;
}

Perilaku ini disalin dari Python os.path.expanduser, kecuali hanya menangani pengguna saat ini. Upaya menjadi platform agnostik dapat ditingkatkan dengan memeriksa platform target daripada mencoba variabel lingkungan yang berbeda secara berbeda-beda USERPROFILE, HOMEDRIVE, dan HOMEPATH tidak mungkin diatur di Linux.


14
2018-02-03 20:09



Dari atas kepala saya,

namespace fs = boost::filesystem;
fs::create_directory(fs::path(getenv("HOME")));

4
2018-02-04 22:50