<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410333&amp;view=findpost&amp;p=3706213</guid>
        <pubDate>Wed, 08 Feb 2017 21:20:47 +0000</pubDate>
        <title>создать нехватающие папки в сетевом пути</title>
        <link>https://forum.sources.ru/index.php?showtopic=410333&amp;view=findpost&amp;p=3706213</link>
        <description><![CDATA[Voice: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410333&view=findpost&p=3706198'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>^D^ima &#064; <time class="tag-quote__quoted-time" datetime="2017-02-08T20:24:37+03:00">08.02.17, 17:24</time></span><div class='quote '>напиши свою, 10 строк кода </div></div><br>
немножко больше<br>
делаю так:<br>
1. подключаю сет.папку (БЕЗ задания диска) с помощью WNetAddConnection2 с заданным логином и паролем к сет.папке<br>
2. если не удалось (часто встречается ошибка о множественном подключении к одной шаре разными пользователями (код ERROR_SESSION_CREDENTIAL_CONFLICT), что в винде недопустимо), задаю логин и пароль как nil, чтобы подключение шло под пользователем по умолчанию (под которым запущен текущий процесс).<br>
3. если и предыдущий шаг не удался, меняю имя сервера на IP<br>
<br>
(все, что выше, так я стандартно подключаю шары)<br>
<br>
теперь дальше с отсутствующими папками<br>
4. если все шаги выше привели к ошибкам, считаю, что папка не существует<br>
5. вырезаю имя последней папки (было &#092;&#092;Share&#092;Folder&#092;MyDocs&#092;Pum-purum&#092;, стало &#092;&#092;Share&#092;Folder&#092;MyDocs&#092;) и рекурсивно вызываю процедуру подключения (goto 1) с передачей имени отсутствующей папки<br>
<br>
т.е. далее опять пытаемся подключить шару (без последней папки) 3-мя способами. Если опять ошибка, то убираем след.папку (будет &#092;&#092;Share&#092;Folder&#092;) и опять пытаемся подключить диск.<br>
<br>
Когда наконец что-то подключается, создаем папку (рекурсия же).<br>
<br>
т.е. очень вкратце процедура выглядит так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function ConnectToUNC(APath, ALogin, APass: string; ACreateFolderName: string = &#39;&#39;): string;</div><div class="code_line">begin</div><div class="code_line">m := WNetAddConnection2(NetResource,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PAnsiChar(APass), {пароль, если нужно (или пусто (nil))}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PAnsiChar(ALogin), {имя юзера, если нужно (или пусто (nil))}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 {CONNECT_UPDATE_PROFILE {восстановить соед. при входе в систему});</div><div class="code_line">if (m = ERROR_SESSION_CREDENTIAL_CONFLICT) and // такой сет.диск уже подключен под другим логином - в винде это недопустимо (2 раза под разными логинами)...</div><div class="code_line">&nbsp;&nbsp; (ALogin &#60;&#62; &#39;&#39;) then // ... и при этом у нас задан логин для подключения, то теперь пытаемся подключиться под текущим пользователем (под которым запущен этот процесс)</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; m := WNetAddConnection2(NetResource,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; nil, //PAnsiChar(APath.Pass), {пароль, если нужно (или пусто (nil))}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; nil, //PAnsiChar(APath.Login), {имя юзера, если нужно (или пусто (nil))}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; 0 {CONNECT_UPDATE_PROFILE {восстановить соед. при входе в систему});</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">// если все равно не удалось, меняем имя компьютера на его IP</div><div class="code_line">if (m &#60;&#62; NO_ERROR) {and (m &#60;&#62; ERROR_SESSION_CREDENTIAL_CONFLICT)} then</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; APath := ChangeShareNameToIP(APath); // меняем имя на IP: \Share\Folder -&#62; \192.168.1.2\Folder</div><div class="code_line">&nbsp;&nbsp; m := WNetAddConnection2(NetResource,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PAnsiChar(APass), {пароль, если нужно (или пусто (nil))}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PAnsiChar(ALogin), {имя юзера, если нужно (или пусто (nil))}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 {CONNECT_UPDATE_PROFILE {восстановить соед. при входе в систему});</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">if m in [NO_ERROR] then // если наконец подключили</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; Result := IncludeTrailingPathDelimiter(APath) + ACreateFolderName; // запоминаем подключенный сетевой путь</div><div class="code_line">&nbsp;&nbsp; end else</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; // если подключить не удалось, убираем последнюю папку (возможно ее не было) и подключаемся на уровень выше</div><div class="code_line">&nbsp;&nbsp; TmpLastFolder := GetLastFolder(APath); // запоминаем недостающую ПОСЛЕДНЮЮ папку</div><div class="code_line">&nbsp;&nbsp; APath := DelLastFolder(APath); // убираем последнюю папку: \Share\Folder\MyDocs\Pum-purum -&#62; \Share\Folder\MyDocs</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ConnectToUNC(ExcludeTrailingPathDelimiter(APath), ALogin, APass, TmpStr);</div><div class="code_line">&nbsp;&nbsp; if TmpStr &#60;&#62; &#39;&#39; then // если задана папка на создание, создаем</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TmpStr := IncludeTrailingPathDelimiter(APath) + TmpStr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if not DirectoryExists(TmpStr) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if not CreateDir(TmpStr) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Print(&#39;Не удалось создать папку&#39;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else Result := TmpStr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
и проблема в том, что при подключении к несуществующей папке иногда появляется ошибка не 53 (Не найден сетевой путь.), а 5 (Отказано в доступе.). При этом папка нормально создается.<br>
Закономерность пока не уловил.<br>
<br>
<span class="b-attach" data-size="5562" data-hits="185" data-attach-id="52111" data-attach-post-id="3706213">
			<span class="b-attach__title">Приложил тестовый проект</span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3706213&amp;attach_id=52111' title='Скачать файл' target='_blank'>CreateNetFoldersEx.rar</a> (, : 185)
		</span>]]></description>
        <author>Voice</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410333&amp;view=findpost&amp;p=3706198</guid>
        <pubDate>Wed, 08 Feb 2017 17:24:37 +0000</pubDate>
        <title>создать нехватающие папки в сетевом пути</title>
        <link>https://forum.sources.ru/index.php?showtopic=410333&amp;view=findpost&amp;p=3706198</link>
        <description><![CDATA[^D^ima: Уверен такой нет, напиши свою, 10 строк кода]]></description>
        <author>^D^ima</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410333&amp;view=findpost&amp;p=3706197</guid>
        <pubDate>Wed, 08 Feb 2017 16:57:10 +0000</pubDate>
        <title>создать нехватающие папки в сетевом пути</title>
        <link>https://forum.sources.ru/index.php?showtopic=410333&amp;view=findpost&amp;p=3706197</link>
        <description><![CDATA[Voice: допустим, задан путь для подключения сетевого диска: &#092;&#092;Share&#092;Folder&#092;MyDocs&#092;Pum-purum&#092;Param-pam-pam<br>но на шаре есть только &#092;&#092;Share&#092;Folder&#092;<br>есть ли готовая функция для автоматического создания недостающих папок (при условии наличия прав)?]]></description>
        <author>Voice</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	