2011-02-23 18 views
7

Uygulamamda her makinede bir uygulama klasöründe bazı dosyalar saklıyorum. Bu makineden yapılan son oturumların hatırlamak (makineye özgü bazı verileri kaydetmek: Bunu kullanmak nedenCSIDL'nin seçtiği yönetici olmayan kullanıcılara da erişilebilecek bir uygulama klasörü almak için SHGetSpecialFolderPath kullanımı?

..\Project1\LoginHistory (login history file - common for all users) 
..\Project1\Translations (localization files - common for all users) 
..\Project1\FormSettings\User1\ (this contains an ini file per form for User1) 
..\Project1\FormSettings\UserN\ (this contains an ini file per form for UserN) 

Yani görebilirsiniz:

gerçek durumda bir basitleştirilmiş versiyonu şudur bir tür MRU), Çeviri dizelerini veya 3. taraf bileşenlerini (bunlar exe kaynaklarından ayıklanan çalışma zamanıdır) ve kullanıcıya özgü verileri (form boyutu gibi) kaydetmek için kullanılır. Gerçek durum daha karmaşıktır, ancak en azından bazı "ortak klasör" ve bazı "kullanıcı klasörleri" vardır.

Şimdi bu yapıyı korumak istiyorum, bu yüzden tüm dosyalarım tek bir klasörde .. \ Project1 klasörü (+ alt klasörleri). Kullanıcılar windows kullanıcıları olmasa bile, SQL Server kullanıcılarıdır.

Soruma ..\ için hangi klasör seçilir.

Şu anda

uses ShlObj; 

function GetSpecialFolder(const CSIDL: integer) : string; 
var 
    RecPath : PWideChar; 
begin 
    RecPath := StrAlloc(MAX_PATH); 
    try 
    FillChar(RecPath^, MAX_PATH, 0); 
    if SHGetSpecialFolderPath(0, RecPath, CSIDL, false) 
     then result := RecPath 
     else result := ''; 
    finally 
     StrDispose(RecPath); 
    end; 
end; 

..\ retrieveing ​​için bu kodu kullanarak (başarılı) değilim Ve ben CDISL listesi here tanımlanır

GetSpecialFolder(CSIDL_APPDATA) 

ile diyoruz.

GetSpecialFolder(CSIDL_APPDATA) döner

Windows 7'de C:\Users\username\AppData\Roaming Yani bu çalışırdım, ama son zamanlarda doğrudan bu klasörlerde/yazma sorunları okumak için ilgili görünen bazı müşteriden bazı şikayeti almıştır. (örneğin, C:\Users\username\AppData\Roaming\Project1\LoginHistory - yukarıda listelenen klasörleri kullanarak).

Bu yüzden sorum şu: CSIDL_APPDATA kullanmak doğru mu? Başka bir önerin var mı? Bazı işletim sistemlerinde veya bazı kullanıcılarda gerçekten azaltılmış ayrıcalıklarla bu klasörde okuma/yazma sorunları olabileceği ihtimali var mıdır?

Dosyalarım için birden fazla kök klasörün olmasını istemediğimi lütfen unutmayın.

+1

Kullanıcıların orada yazabilmesi gerekir. Aksi halde tüm sistem bozulur. Dosya yazmadan önce eksik dizinler oluşturmanız gerekebilir. Bize hata kodu ve mesajını söylemezseniz hata ayıklamak zor! –

+0

Evet, kullanıcı elbette yazamıyorsa, tüm fikir çalışmıyor. Sorunu yeniden üretemiyorum, birisinin bu problemi olduğu söylendi, bu yüzden sebebin ne olduğunu tahmin etmeye çalışıyorum. Probabyl Ben daha fazla araştırmak için bir şansım olacak, ama şimdi değil. Bu yüzden sordum. – LaBracca

cevap

0

Sonunda kullandığım yaklaşım doğru. Uygulamam için gerçekten dosyalara gereksinim duymadığımdan (tüm geçici dosyaların kullanıcıya özgü olması mantıklıdır - çünkü çok az şey DB'de saklanmaktadır) CSIDL_APPDATA iyi bir yerdir.

Karşı karşıya kaldığım sorun hala net değil, ancak login.ini'nin ayrılmış bir sözcük olduğu (aslında yakın zamanda bazı yeni pencere güncellemelerinden sonra) gerçeğinden kaynaklandığından şüpheleniyorum.

Zaten this question'a sordum.

5

Kullanıcıya özgü olmayan dosyalar için CSIDL_COMMON_APPDATA kullanmak istediğinizi düşünüyorum. (Kodunuzda), CSIDL_APPDATA'da saklanan dosyaların kullanıcılar arasında paylaşıldığını varsayıyorsanız, buna izin verilmez.

+0

Ancak, "makinede ayrıcalık yok" olan bir kullanıcı demek istediniz, bir tür "misafir" kullanıcısının "CSIDL_COMMON_APPDATA" dan "CSIDL_APPDATA" dan değil de "CSIDL_COMMON_APPDATA" yazmasını söyleyebiliriz? "CSIDL_COMMON_APPDATA" ya geçerek, işlerin daha iyi gidip gelmeyeceği ihtimali var mı? Ya da bunu "semantik olarak" daha iyi bir seçenek (ve sana katılıyorum) olacağı için mi öneriyorsunuz? – LaBracca

+0

Sadece onaylamak için: 'CSIDL_COMMON_APPDATA'% 100 daha iyi, burada (http://msdn.microsoft.com/en-us/library/bb762494(v=vs.85).aspx)" Bu bilgi değil, bilgisayar kullanan herkes için kullanılabilir. " Bu, CSIDL_APPDATA için yazılmamışken. – LaBracca

+0

Bir yorumum daha var: ve bir terminal sunucusu senaryosunda ne olur? Bu durumda, daha fazla kullanıcı aynı klasörü kullanıyor olacak ve bu bir sorun olabilir. – LaBracca