فيستا وProgramData
-
02-07-2019 - |
سؤال
ما هو المكان المناسب لتخزين ملفات بيانات البرنامج التي تكون هي نفسها لكل مستخدم ولكن يجب أن تكون قابلة للكتابة للبرنامج؟ما هو الموقع المكافئ على نظام التشغيل MS Windows XP؟لقد قرأت أن C:\ProgramData غير قابل للكتابة بعد التثبيت بواسطة المستخدمين العاديين.هل هذا صحيح؟كيف يمكنني استرداد هذا الدليل برمجيًا باستخدام Platform SDK؟
المحلول
SHGetFolderPath() مع CSIDL لـ CSIDL_COMMON_APPDATA.
اقرا المزيد من http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
إذا كنت بحاجة إلى المسار في ملف دفعي، فيمكنك أيضًا استخدام متغير البيئة %ALLUSERSPROFILE%.
نصائح أخرى
يوجد ملخص رائع للخيارات المختلفة هنا: http://blogs.msdn.com/cjacks/archive/2008/02/05/where-should-i-write-program-data-instead-of-program-files.aspx
أين يجب أن أكتب بيانات البرنامج بدلاً من ملفات البرنامج؟
تحديث رمز التطبيق الشائع هو:"يستخدم طلبي لكتابة الملفات إلى ملفات البرمجة.بدا الأمر وكأنه مكان جيد لوضعه مثل أي مكان آخر.كان له اسم طلبي عليه بالفعل ، ولأن مستخدمي كانوا مدراء ، فقد عمل بشكل جيد.لكنني الآن أرى أن هذا قد لا يكون مكانًا رائعًا لالتصاق بالأشياء كما اعتقدت ذات مرة ، لأنه مع تشغيل UAC حتى يتم تشغيل المسؤولين بامتيازات قياسية تشبه المستخدم معظم الوقت.لذا ، أين يجب أن أضع ملفاتي بدلاً من ذلك؟ "
في الحقيقة SHGetFolderPath
تم إهماله.
SHGetKnownFolderPath
يجب أن تستخدم بدلا من ذلك.
يمكنك استخدام:
CString strPath;
::SHGetSpecialFolderPath(NULL, strPath.GetBuffer(1024), CSIDL_COMMON_APPDATA, FALSE);
يرى مقالة ريموند تشين حول هذا السؤال المحدد.
باختصار أنت تطلب أ ثغرة أمنية.