2010-03-31 23 views
21

Kullanıcının giriş dizini C++ ile çapraz platformda nasıl bulunur? Linux'ta/home/kullanıcı, Windows Vista'da C: \ Users \ user \, Windows XP'de C: \ Documents and Settings \ user \ ve Mac'lerin kullandığı her şey. (Sanırım öyle/Kullanıcı/kullanıcı) TemeldeKullanıcının ev dizinini C++ kullanarak çapraz platform biçiminde nasıl bulabilirim?

, ne arıyorum ben tamamen gizlemek mümkün olduğunu sanmıyorum bu (python örneği)

os.path.expanduser("~") 
+4

Çapraz platform, yapamazsınız. Standart C++ böyle bir işleve sahip değildir. –

+1

Cevabımı kontrol edin, platformlar arası bir yol var: '# ifdef': D'yi kullanarak uygularsınız: D – sorin

+0

Ayrıca bkz. Http: // stackoverflow.com/questions/2910377/get-home-directory-in-linux-c – rogerdpack

cevap

22

yapmanın bir C++ yoludur Windows/Unix bu ile bölünür (belki, Boost bir şey var).

En taşınabilir yol, Unix'te getenv("HOME") ve Windows'ta getenv("HOMEDRIVE") ve getenv("HOMEPATH") sonuçlarının birleştirilmesi olmalıdır.

+11

+1 Bu, Qt'nin QDir :: homepath() 'da yaptıklarının az ya da çok azıdır: http://doc.trolltech.com/4.6 /qdir.html#homePath. Muhtemelen onların kaynaklarını da kontrol et. – stephan

+0

Not gerçekten. QT görünüşte "CSIDL_PROFILE" değerini döndürüyor. Ve bilgisayarımda, bu farklı bir dizin. ('% HOMEDRIVE%' dosya sunucusunda, 'CSIDL_PROFILE' değil.) – MSalters

+0

@MSalters: biraz tarihli Qt kurulumunun kaynağını kontrol ettim: Windows'da" HOME "," USERPROFILE "," HOMEDRIVE "ı kontrol eder. Unix'te, sadece "HOME" çalışır. Ayarlanmazsa, kök yolunu döndürür. – stephan

2

Giriş dizini gerçekten platformlar arası bir kavram değildir. Profil dizininin kökünü (% USERPROFILE%) öneriniz adil bir benzeşimdir, ancak dizini aldıktan sonra ne yapmak istediğinize bağlı olarak, Uygulama Veri dizinlerinden birini veya kullanıcının Belgelerim'i isteyebilirsiniz. UNIX'te, dosyalarınızı saklamak için giriş dizininde gizli bir ".myapp" oluşturabilirsiniz, ancak bu Windows'ta doğru değildir.

En iyi seçiminiz, her bir durumda istediğiniz dizine ulaşmak için her platform için özel kod yazmaktır. Ne kadar doğru olmak istediğinize bağlı olarak, env vars: Windows üzerinde UNIX, USERPROFILE veya APPDATA (ihtiyacınız olana bağlı olarak) üzerinde HOME kullanmak için yeterli olabilir.

UNIX'te en azından (herhangi bir Windows kullanıcıları yorum yapmayı önemsiyor mu?), Ayarlanmışsa EV ortam değişkeni kullanmak, parola dosyasındaki dizine uymuyor olsa bile genellikle iyi bir uygulamadır. Ardından, kullanıcıların tüm uygulamaların verilerini farklı bir dizinden okumasını istediği garip olaylarda, yine de çalışır.

14

Bu o C aynı işlevselliği çoğaltmak için gerçekten çok kolay, ve os.path.expanduser("~") kaynak kodunu ele almaktır bulmanın en iyi yolu mümkündür

Bazı #ifdef eklemek gerekecek

farklı sistemleri kapsayan direktifler. İşte

size ANA dizini

  • , Windows sağlayacak kurallar şunlardır: env USERPROFILE veya bu başarısız olursa, HOMEDRIVEHOMEPATH
  • Linux, Unix ve OS X + bitiştirmek: env HOME veya bu başarısız olursa birçok kişiolduğunu varsayıyoruz: getpwuid() (example code)

Önemli açıklama kullanınortam değişkeni Unix'te her zaman kullanılabilir, ancak bu doğru değil, iyi bir örnek OS X olacaktır.

GUI'den (konsol değil) bir uygulamayı çalıştırdığınızda OS X'de, bu değişken setiniz olmayacaktır. getpwuid() kullanmanız gerekir.

İlgili konular