سؤال

باستخدام دلفي، كيف يمكنني الوصول إلى ما يعادل متغير System.Environment.SpecialFolder.LocalApplicationData الخاص بـ .NET (والذي يعمل على أي إصدار من Windows)؟لقد افترضت أنه يمكنني فقط القيام بما يلي:

dir := GetEnvironmentVariable('LOCALAPPDATA');

يعمل هذا على نظام التشغيل Vista ولكن يبدو أن XP لا يقوم بتعيين متغير البيئة هذا افتراضيًا على جهاز الاختبار الخاص بي على الأقل.

هل كانت مفيدة؟

المحلول

في دلفي، يتم تعريف ثوابت مسار مجلد النظام الخاص في ShlObj.DCU، ويتم الرجوع إليها في شكل CSIDL_ متبوعًا باسم رمزي.مثال:

  • ترجع CSIDL_DESKTOPDIRECTORY المسار إلى سطح المكتب الحالي
  • CSIDL_PERSONAL هو مستنداتي الدليل
  • CSIDL___LOCAL_APPDATA هو (اسم المستخدم)\الإعدادات المحلية\التطبيق بيانات الدليل

إليك وظيفة سريعة ستعيد مسار المجلد الخاص المناسب عند إعطاء الاسم الرمزي.تأكد من تضمين وحدة SHLOBJ.DCU في بيان الاستخدامات الخاص بك، واستخدم ما يلي:

function GetSpecialFolderPath(Folder: Integer; CanCreate: Boolean): string;

// Gets path of special system folders
//
// Call this routine as follows:
// GetSpecialFolderPath (CSIDL_PERSONAL, false)
//        returns folder as result
//
var
   FilePath: array [0..255] of char;

begin
 SHGetSpecialFolderPath(0, @FilePath[0], FOLDER, CanCreate);
 Result := FilePath;
end;

================================================================

وللإشارة فإن الثوابت هي كما يلي:

  CSIDL_DESKTOP                       = $0000; { <desktop> }
  CSIDL_INTERNET                      = $0001; { Internet Explorer (icon on desktop) }
  CSIDL_PROGRAMS                      = $0002; { Start Menu\Programs }
  CSIDL_CONTROLS                      = $0003; { My Computer\Control Panel }
  CSIDL_PRINTERS                      = $0004; { My Computer\Printers }
  CSIDL_PERSONAL                      = $0005; { My Documents.  This is equivalent to CSIDL_MYDOCUMENTS in XP and above }
  CSIDL_FAVORITES                     = $0006; { <user name>\Favorites }
  CSIDL_STARTUP                       = $0007; { Start Menu\Programs\Startup }
  CSIDL_RECENT                        = $0008; { <user name>\Recent }
  CSIDL_SENDTO                        = $0009; { <user name>\SendTo }
  CSIDL_BITBUCKET                     = $000a; { <desktop>\Recycle Bin }
  CSIDL_STARTMENU                     = $000b; { <user name>\Start Menu }
  CSIDL_MYDOCUMENTS                   = $000c; { logical "My Documents" desktop icon }
  CSIDL_MYMUSIC                       = $000d; { "My Music" folder }
  CSIDL_MYVIDEO                       = $000e; { "My Video" folder }
  CSIDL_DESKTOPDIRECTORY              = $0010; { <user name>\Desktop }
  CSIDL_DRIVES                        = $0011; { My Computer }
  CSIDL_NETWORK                       = $0012; { Network Neighborhood (My Network Places) }
  CSIDL_NETHOOD                       = $0013; { <user name>\nethood }
  CSIDL_FONTS                         = $0014; { windows\fonts }
  CSIDL_TEMPLATES                     = $0015;
  CSIDL_COMMON_STARTMENU              = $0016; { All Users\Start Menu }
  CSIDL_COMMON_PROGRAMS               = $0017; { All Users\Start Menu\Programs }
  CSIDL_COMMON_STARTUP                = $0018; { All Users\Startup }
  CSIDL_COMMON_DESKTOPDIRECTORY       = $0019; { All Users\Desktop }
  CSIDL_APPDATA                       = $001a; { <user name>\Application Data }
  CSIDL_PRINTHOOD                     = $001b; { <user name>\PrintHood }
  CSIDL_LOCAL_APPDATA                 = $001c; { <user name>\Local Settings\Application Data (non roaming) }
  CSIDL_ALTSTARTUP                    = $001d; { non localized startup }
  CSIDL_COMMON_ALTSTARTUP             = $001e; { non localized common startup }
  CSIDL_COMMON_FAVORITES              = $001f;
  CSIDL_INTERNET_CACHE                = $0020;
  CSIDL_COOKIES                       = $0021;
  CSIDL_HISTORY                       = $0022;
  CSIDL_COMMON_APPDATA                = $0023; { All Users\Application Data }
  CSIDL_WINDOWS                       = $0024; { GetWindowsDirectory() }
  CSIDL_SYSTEM                        = $0025; { GetSystemDirectory() }
  CSIDL_PROGRAM_FILES                 = $0026; { C:\Program Files }
  CSIDL_MYPICTURES                    = $0027; { C:\Program Files\My Pictures }
  CSIDL_PROFILE                       = $0028; { USERPROFILE }
  CSIDL_SYSTEMX86                     = $0029; { x86 system directory on RISC }
  CSIDL_PROGRAM_FILESX86              = $002a; { x86 C:\Program Files on RISC }
  CSIDL_PROGRAM_FILES_COMMON          = $002b; { C:\Program Files\Common }
  CSIDL_PROGRAM_FILES_COMMONX86       = $002c; { x86 C:\Program Files\Common on RISC }
  CSIDL_COMMON_TEMPLATES              = $002d; { All Users\Templates }
  CSIDL_COMMON_DOCUMENTS              = $002e; { All Users\Documents }
  CSIDL_COMMON_ADMINTOOLS             = $002f; { All Users\Start Menu\Programs\Administrative Tools }
  CSIDL_ADMINTOOLS                    = $0030; { <user name>\Start Menu\Programs\Administrative Tools }
  CSIDL_CONNECTIONS                   = $0031; { Network and Dial-up Connections }
  CSIDL_COMMON_MUSIC                  = $0035; { All Users\My Music }
  CSIDL_COMMON_PICTURES               = $0036; { All Users\My Pictures }
  CSIDL_COMMON_VIDEO                  = $0037; { All Users\My Video }
  CSIDL_RESOURCES                     = $0038; { Resource Directory }
  CSIDL_RESOURCES_LOCALIZED           = $0039; { Localized Resource Directory }
  CSIDL_COMMON_OEM_LINKS              = $003a; { Links to All Users OEM specific apps }
  CSIDL_CDBURN_AREA                   = $003b; { USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning }
  CSIDL_COMPUTERSNEARME               = $003d; { Computers Near Me (computered from Workgroup membership) }
  CSIDL_PROFILES                      = $003e;

نصائح أخرى

يرى هذا المقال.

يحرر:

كما تمت إضافته في تعليق stukelly، هناك الكثير من المعلومات المتوفرة حول وظيفة SHGetFolderPath().يجب أن يكون لدى Delphi VCL حقًا وظيفة للحصول على المسارات القياسية، وإذا كانت Embarcadero ستمتلك بالفعل أداة أخرى تشبه دلفي على نظام تشغيل آخر، فسيكون هذا أكثر أهمية.للحصول على تطبيق متعدد المنصات للمسارات القياسية للنظام، راجع أيضًا توثيق wxStandardPaths في wxWidgets.في MSW يستخدم هذا مختلف CSIDL_XXX الثوابت.

وعلى افتراض انك يمكن أن تجعل WINAPI يدعو من دلفي (التي ISTR استطعت)، استخدمته لتكون قادرة على أن تفعل ذلك مع مكالمة API (شيء من هذا القبيل GetSystemFolder أو GetUserDataFolder). انها كانت منذ بعض الوقت لقد كان للقيام بذلك، ولكن أعتقد أنك تستطيع أن تفعل الآن مع <لأ href = "http://msdn.microsoft.com/en-us/library/bb762181(VS.85). ASPX "يختلط =" نوفولو noreferrer "> SHGetFolderPath أو عن طريق تمرير في CSIDL_LOCAL_APPDATA.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top