На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> создать нехватающие папки в сетевом пути
    допустим, задан путь для подключения сетевого диска: \\Share\Folder\MyDocs\Pum-purum\Param-pam-pam
    но на шаре есть только \\Share\Folder\
    есть ли готовая функция для автоматического создания недостающих папок (при условии наличия прав)?
      Уверен такой нет, напиши свою, 10 строк кода
        Цитата ^D^ima @
        напиши свою, 10 строк кода

        немножко больше
        делаю так:
        1. подключаю сет.папку (БЕЗ задания диска) с помощью WNetAddConnection2 с заданным логином и паролем к сет.папке
        2. если не удалось (часто встречается ошибка о множественном подключении к одной шаре разными пользователями (код ERROR_SESSION_CREDENTIAL_CONFLICT), что в винде недопустимо), задаю логин и пароль как nil, чтобы подключение шло под пользователем по умолчанию (под которым запущен текущий процесс).
        3. если и предыдущий шаг не удался, меняю имя сервера на IP

        (все, что выше, так я стандартно подключаю шары)

        теперь дальше с отсутствующими папками
        4. если все шаги выше привели к ошибкам, считаю, что папка не существует
        5. вырезаю имя последней папки (было \\Share\Folder\MyDocs\Pum-purum\, стало \\Share\Folder\MyDocs\) и рекурсивно вызываю процедуру подключения (goto 1) с передачей имени отсутствующей папки

        т.е. далее опять пытаемся подключить шару (без последней папки) 3-мя способами. Если опять ошибка, то убираем след.папку (будет \\Share\Folder\) и опять пытаемся подключить диск.

        Когда наконец что-то подключается, создаем папку (рекурсия же).

        т.е. очень вкратце процедура выглядит так:
        ExpandedWrap disabled
          function ConnectToUNC(APath, ALogin, APass: string; ACreateFolderName: string = ''): string;
          begin
          m := WNetAddConnection2(NetResource,
                                        PAnsiChar(APass), {пароль, если нужно (или пусто (nil))}
                                        PAnsiChar(ALogin), {имя юзера, если нужно (или пусто (nil))}
                                        0 {CONNECT_UPDATE_PROFILE {восстановить соед. при входе в систему});
          if (m = ERROR_SESSION_CREDENTIAL_CONFLICT) and // такой сет.диск уже подключен под другим логином - в винде это недопустимо (2 раза под разными логинами)...
             (ALogin <> '') then // ... и при этом у нас задан логин для подключения, то теперь пытаемся подключиться под текущим пользователем (под которым запущен этот процесс)
             begin
             m := WNetAddConnection2(NetResource,
                   nil, //PAnsiChar(APath.Pass), {пароль, если нужно (или пусто (nil))}
                   nil, //PAnsiChar(APath.Login), {имя юзера, если нужно (или пусто (nil))}
                   0 {CONNECT_UPDATE_PROFILE {восстановить соед. при входе в систему});
             end;
          // если все равно не удалось, меняем имя компьютера на его IP
          if (m <> NO_ERROR) {and (m <> ERROR_SESSION_CREDENTIAL_CONFLICT)} then
             begin
             APath := ChangeShareNameToIP(APath); // меняем имя на IP: \\Share\Folder -> \\192.168.1.2\Folder
             m := WNetAddConnection2(NetResource,
                                         PAnsiChar(APass), {пароль, если нужно (или пусто (nil))}
                                         PAnsiChar(ALogin), {имя юзера, если нужно (или пусто (nil))}
                                         0 {CONNECT_UPDATE_PROFILE {восстановить соед. при входе в систему});
             end;
           
          if m in [NO_ERROR] then // если наконец подключили
             begin
             Result := IncludeTrailingPathDelimiter(APath) + ACreateFolderName; // запоминаем подключенный сетевой путь
             end else
             begin
             // если подключить не удалось, убираем последнюю папку (возможно ее не было) и подключаемся на уровень выше
             TmpLastFolder := GetLastFolder(APath); // запоминаем недостающую ПОСЛЕДНЮЮ папку
             APath := DelLastFolder(APath); // убираем последнюю папку: \\Share\Folder\MyDocs\Pum-purum -> \\Share\Folder\MyDocs
           
             ConnectToUNC(ExcludeTrailingPathDelimiter(APath), ALogin, APass, TmpStr);
             if TmpStr <> '' then // если задана папка на создание, создаем
                begin
                TmpStr := IncludeTrailingPathDelimiter(APath) + TmpStr;
                if not DirectoryExists(TmpStr) then
                   if not CreateDir(TmpStr) then
                      Print('Не удалось создать папку')
                      else Result := TmpStr;
                end;
             end;
          end;


        и проблема в том, что при подключении к несуществующей папке иногда появляется ошибка не 53 (Не найден сетевой путь.), а 5 (Отказано в доступе.). При этом папка нормально создается.
        Закономерность пока не уловил.

        Приложил тестовый проектПрикреплённый файлCreateNetFoldersEx.rar (5,43 Кбайт, скачиваний: 128)
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0310 ]   [ 18 queries used ]   [ Generated: 19.03.24, 06:00 GMT ]