2009-08-11 9 views
8

Potrzebuję przechowywać pliki na wspólnym pulpicie w systemie Windows. Aplikacja jest bardzo specjalną aplikacją dla dokładnie jednego specjalnego komputera (przygotowanie urządzenia), więc musieli być łatwi dla nietechnicznych użytkowników, aby znaleźli i zmodyfikowali plik konfiguracyjny. Teraz przełączyliśmy się na domenę, a ponieważ różne osoby (z różnymi kontami) powinny korzystać z oprogramowania, musi to być wspólne miejsce, widziane przez każdego użytkownika. Więc proszę nie pytać, dlaczego jest na pulpicie;)Uzyskaj wspólną ścieżkę pulpitu w .NET

Wcześniej użyłem tylko Environment.GetFolderPath(Environment.SpecialFolder.Desktop). Istnieje kilka typowych folderów w wyliczeniu SpecialFolder, ale wydaje się, że nie ma tam wspólnego pulpitu. Czy brakuje mi czegoś, czy muszę p/invoke SHGetSpecialFolderPath z CSIDL_COMMON_DESKTOPDIRECTORY?

+0

Teraz robi się brudny. Niestety wydaje mi się, że domyślnie nie mam prawa pisać na zwykłym pulpicie, co sprawia, że ​​jest to skomplikowane. Wszelkie sugestie dotyczące lepszej lokalizacji? Pamiętaj, że użytkownik powinien być w stanie znaleźć plik, a wszyscy użytkownicy potrzebują dostępu do odczytu/zapisu. Aplikacja powinna zostać wdrożona przez XCOPY. – OregonGhost

+0

Podczas gdy pierwotne pytanie pozostaje aktualne (zwłaszcza, że ​​wydaje się, że nie ma go nigdzie na SO), myślę, że będę musiał pójść ze wspólnymi dokumentami (lub jakakolwiek nazwa w systemach angielskich). To wciąż jest możliwe do znalezienia przez użytkownika. Teraz miejmy nadzieję, że mam dostęp do zapisu. Zapraszam do komentowania, jeśli uważasz, że jest to dobry/zły pomysł. – OregonGhost

+0

Dlaczego nie przechowujesz ich w odizolowanym miejscu pamięci urządzenia? –

Odpowiedz

2

Myślę, że musisz użyć interfejsu API SHGetSpecialFolderPath, ponieważ nie ma wartości wyliczeniowej dla "CommonDesktopDirectory". Nie można jawnie użyć wartości CSIDL_COMMON_DESKTOPDIRECTORY i przesłać ją do Environment.SpecialFolder, ponieważ metoda GetFolderPath sprawdza, czy wartość jest zdefiniowana w wyliczeniu. Oto kod metody GetFolderPath (z reflektorem):

public static string GetFolderPath(SpecialFolder folder) 
{ 
    if (!Enum.IsDefined(typeof(SpecialFolder), folder)) 
    { 
     throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, GetResourceString("Arg_EnumIllegalVal"), new object[] { (int) folder })); 
    } 
    StringBuilder lpszPath = new StringBuilder(260); 
    Win32Native.SHGetFolderPath(IntPtr.Zero, (int) folder, IntPtr.Zero, 0, lpszPath); 
    string path = lpszPath.ToString(); 
    new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path).Demand(); 
    return path; 
} 

Więc można łatwo kopiować i dostosowania części, które trzeba ...

+0

OK, chciałem tylko mieć pewność.Teraz, gdy obejrzałem dokumenty MSDN, jest uwaga, że ​​w Vista i później, powinieneś używać KNOWNFOLDERID zamiast wartości CLSID. Czy to też ma zastosowanie, jeśli moja aplikacja musi działać na XP? – OregonGhost

+0

Nie, myślę, że to dla Vista tylko –

+0

Prawdopodobnie pójdę z innym folderem (zobacz moje komentarze do pytania), ale jest to najlepsza odpowiedź na to pytanie, więc zaakceptowałem to. Dzięki za szybką odpowiedź. – OregonGhost

0

Dla wyjaśnienia - Dzięki wspólnym pulpicie masz na myśli C: \ Dokumenty i ustawienia \ Wszyscy użytkownicy \ Pulpit?

Jeśli tak, to jest brzydki Hack -

Dim c As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 
Dim comDesktop As String = c.Substring(0, c.LastIndexOf("\")) + "\Desktop" 
+0

Tak, mam na myśli to. Ale to naprawdę brzydkie. – OregonGhost

+0

Spowoduje to awarię, gdy tylko jakiś system użyje innej nazwy dla Pulpitu: p –

0

Najpierw dodaj odniesieniem do „Windows Script Host Object Model". Znajdziesz to w zakładce COM okna "Dodaj referencje".

using IWshRuntimeLibrary; 

object commonUserDesktop = "AllUsersDesktop"; 
WshShell shell = new WshShellClass(); 
string commonPath = shell.SpecialFolders.Item(ref commonUserDesktop).ToString(); 
+0

Jak napisałem w odpowiedzi Bogdan_Ch wolałbym nie używaj WSH do takiego zadania. P/Invoke jest ze mną w porządku. – OregonGhost

0

Innym sposobem (tak jest też brzydka i działa chyba tylko na Windows XP, a nie na Vista) jest odczytać wartość z rejestru

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Foldery powłoki, wspólny pulpit

+0

To nie tylko brzydki, ale koszmar kompatybilności. Jeśli dobrze pamiętam, to było tylko w niektórych wersjach CTP Windows, ale ponieważ aplikacje na nim polegały, musi być w systemie Windows przez dziesięciolecia. – OregonGhost

Powiązane problemy