Конференция "WinAPI" » Получения пути к папке "Мои документы" (CSIDL_PERSONAL)
 
  • Добежал (24.12.08 18:15) [0]
    Кое что смущает в хелпе:

    CSIDL_PERSONAL (FOLDERID_Documents)
    Version 6.0. The virtual folder that represents the My Documents desktop item. This is equivalent to CSIDL_MYDOCUMENTS.
    Previous to Version 6.0. The file system directory used to physically store a user's common repository of documents. A typical path is C:\Documents and Settings\username\My Documents. This should be distinguished from the virtual My Documents folder in the namespace. To access that virtual folder, use SHGetFolderLocation, which returns the ITEMIDLIST for the virtual location, or refer to the technique described in Managing the File System



    Я так и не понял - а почему следут отличать путь к виртуальной папки от пути физического?

    Имеет ли это значение, если данный путь используется для того, чтобы сделать Reset / Rewrite над путем:

    [ПолученныйПуть]\Company\ProductName\blabla.ini ?
  • Добежал (24.12.08 18:18) [1]
    А перед этим еще:

    ForceDir([ПолученныйПуть]\Company\ProductName\)
  • DVM © (24.12.08 22:48) [2]

    > а почему следут отличать путь к виртуальной папки от пути
    > физического?

    потому что Мои документы виртуальная папка. Она размещена на рабочем столе, но ее там нет на самом деле.
  • DVM © (24.12.08 22:52) [3]
    Для получения пути используй SHGetSpecialFolderPath()
  • Добежал (25.12.08 11:35) [4]

    > Для получения пути используй SHGetSpecialFolderPath()


    это понятно, естественно, я ее и использую. Но там же надо передавать CSIDL. Вот мне нужно записать некоторые файлы в "Мои документы".

    Откуда возникает вопрос. Как я понимаю, в Vista вернется путь к виртуальной папке, в системах ниже - к физической папке.

    Вопрос - а почему их стоит различать? Есть ли какие-то особенности, если я хочу сделать:

    ForceDir([ПолученныйПуть]\Company\ProductName\)



    а потом
    Rewrite

    над
    [ПолученныйПуть]\Company\ProductName\blabla.ini

    ?

    Есть ли какое различие в случаях если
    [ПолученныйПуть]

    виртуальный (Vista и выше) или реальный (ниже Vista)?
  • DVM © (25.12.08 13:33) [5]

    > Как я понимаю, в Vista вернется путь к виртуальной папке,
    >  в системах ниже - к физической папке.

    SHGetSpecialFolderPath по-моему везде возвращает реальную папку. Я в висте смотрел, но не помню.


    > Вот мне нужно записать некоторые файлы в "Мои документы".

    ну дык в чем проблема то:

    result := GetSpecialFolderPath(CSIDL_PERSONAL);
    if result = '' then result := GetSpecialFolderPath(CSIDL_MYDOCUMENTS);

    function GetSpecialFolderPath(id: integer): string;
    type
     TSHGetSpecialFolderPath = function(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL; stdcall;
    var
     Path: array[0..MAX_PATH] of char;
     SHGetSpecialFolderPath: TSHGetSpecialFolderPath;
    begin
     result := '';
     ZeroMemory(@Path, SizeOf(Path));
     if (hShell32 > 0) then
       begin
         @SHGetSpecialFolderPath := GetProcAddress(hShell32, 'SHGetSpecialFolderPathA');
         if Assigned(SHGetSpecialFolderPath) then
           begin
             SHGetSpecialFolderPath(0, Path, id, false);
             result := AddSlash(path);
           end;
       end;
    end;

  • Добежал (25.12.08 13:52) [6]

    > SHGetSpecialFolderPath по-моему везде возвращает реальную
    > папку


    а, ну вот это мне и нужно было. Ты уверен в этом? Просто в описании SHGetSpecialFolderPath -  http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx - это не понятно.

    А в описании самих CSIDL - http://msdn.microsoft.com/en-us/library/bb762494.aspx - написано то, что я процитировал в первом сообщении. И непонятно к какой функции это относится.

    Написано, что в системах до висты CSIDL_PERSONAL возвращает путь к физической папке, а в висте и выше - к виртуальной. Если же SHGetSpecialFolderPath с параметром CSIDL_PERSONAL возвращает путь ВСЕГДА к физической - имхо, это несколько противоречит описанию.
  • Добежал (25.12.08 13:54) [7]
    DVM, кстати, если говорить про твой алгоритм - то есть замечания. Во-первых, SHGetSpecialFolderPath возвращает bool, а ты это не проверяешь. Хотя я понимаю, что в всегда и так работает ;)

    Во-вторых, ты используешь какую-то AddSlash, судя по всему собственную функцию. По смыслу кода могу догадаться, что ты просто не знаешь про стандартную в VCL функцию: IncludeTrailingPathDelimiter
  • Добежал (25.12.08 14:00) [8]
    что касается висты, то путь возвращается вида:

    'C:\Users\[UserName]\Documents\'



    Это виртуальный путь или реальный? Похож на реальный, но опять же в проводнике в списке папок эта папка Users видится не как Users, а как "Пользователи" и подпапка Documents называется "Документы".

    Это проводник так русифицирует названия папок? Или
    C:\Users\[UserName]\Documents\

    это виртуальная папка?
  • DVM © (25.12.08 21:30) [9]

    > Добежал   (25.12.08 13:54) [7]


    > DVM, кстати, если говорить про твой алгоритм - то есть замечания.

    весь этот сыр бор затеян только для того, что SHGetSpecialFolderPathA появилась в Win не сразу, а с какой то версии. Мне надо было чтобы везде работало.
    Если функции не оказывалось я читал нужную инфу из реестра.


    > Во-первых, SHGetSpecialFolderPath возвращает bool, а ты
    > это не проверяешь

    ну ты сам ответил почему :)


    > Во-вторых, ты используешь какую-то AddSlash, судя по всему
    > собственную функцию. По смыслу кода могу догадаться, что
    > ты просто не знаешь про стандартную в VCL функцию: IncludeTrailingPathDelimiter

    Да, сорри, забыл.

    Кстати, если интересно, вот тут все вместе:

    http://dvmuratov.narod.ru/files/SysFolders.zip


    > 'C:\Users\[UserName]\Documents\'
    >
    > Это виртуальный путь или реальный?

    Реальный 100%.


    > но опять же в проводнике в списке папок эта папка Users
    > видится не как Users, а как "Пользователи" и подпапка Documents
    > называется "Документы".

    Ты не смотри в проводнике, смотри либо сам, либо другим файловым менеджером, а еще лучше посмотри загрузившись в другую ОС.
  • DVM © (25.12.08 21:34) [10]

    > По смыслу кода могу догадаться, что ты просто не знаешь
    > про стандартную в VCL функцию: IncludeTrailingPathDelimiter

    :) Знаю конечно. Просто захотелось сделать модуль минимально зависящий от SysUtils и прочего.
  • han_malign © (26.12.08 14:36) [11]

    > Есть ли какое различие в случаях если [ПолученныйПуть] виртуальный
    (Vista и выше) или реальный (ниже Vista)?

    > Реальный 100%.

    - раньше можно было монтировать папку как диск, а в V ее можно монтировать по любому пути(фактичеcки псевдоним назначать)...
    Например скрытая папка "Document and Settings" - насквозь виртальное перенапрвление на "Users"(для совместимости старых приложений пишущих по зашитым абсолютным путям)...
    Самое веселое, что там есть рекурсивные переходы на  "Document and Settings" - наверно поэтому там запрещены права на просмотр, чтобы при построении дерева не навернуться...

    cd "Document and Settings" - обломится
    md \Users\[UserName]\Where-are-you
    cd "Document and Settings\[UserName]\Where-are-you"
  • TIF © (27.07.09 15:50) [12]
  • имя (13.08.09 20:53) [13]
    Удалено модератором
 
Конференция "WinAPI" » Получения пути к папке "Мои документы" (CSIDL_PERSONAL)
Есть новые Нет новых   [134434   +27][b:0][p:0.001]