Что нового

При копировании создаются папки с одинаковым именем

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Как можно сие объяснить? все написано на кириллице. копировал перетягиванием тут же на диске. можно заметить, что у исходной папки есть пробел в начале. но создать имя с пробелом в начале не получается.
система вин 10 с последними обновлениями.
новая папка создается с тем же именем, но без пробела
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    21.2 КБ · Просмотры: 10

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Как можно сие объяснить?
Папка с пробелами создана программно, а при перетаскивании проводник фильтрует имя и обрезает пробелы - вот и получаются почти одноименные папки.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Так же программно можно задать имя например ".имя" но ручками уже не переименуешь ну и еще там пара ньюансов не приятных, будет выдавать ошибку. Но такие имена как "..имя" или ". имя" или ".имя.имя" или ".имя имя" работают как надо и ручками переименовать можно.

Если нужно вот функцию состряпал проверяющую валидность пути, так же валидным считаются пути начинающиеся на "\" - что значит текущий диск, ".\" - текущий каталог / тоже что и @ScriptDir , "..\" - предыдущий каталог / каталог назад. Пути начинающиеся например на "D:Folder" в системе тоже считается правильным, но я в функции его помечаю как ошибочный, так как считаю что этот тип пути бесполезен.
Код:
Func Path_IsCorrect_($_sPath)
   Local $_iResult = StringRegExp($_sPath, '\A\z|[|/\*<>?"\v\t]|((\A([^[:alpha:]]|))|.{2}):|:(\z|[^\\])|\\{2}|\.{2}\z|(\A|\\)\h+|(\.{2,}[\h\.]+|\\\.|[^\.\\]\.+|\h+)(\z|\\)|(\A|\\)\.[^\.\h\\]+(\\|\z)', '')
   Return Not $_iResult
EndFunc
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
функцию состряпал проверяющую валидность пути
Мне кажется так будет достаточно:

Код:
#include <WinAPIShPath.au3>

ConsoleWrite(_PathIsValid(@SystemDir) & @CRLF)

Func _PathIsValid($sPath)
    Return _WinAPI_PathIsUNC($sPath) Or Not _WinAPI_PathIsFileSpec($sPath)
EndFunc
 
  • Like
Реакции: IiIr
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Интересен сам факт. В эту папку, что с 2018 года, я вручную копировал файлы с флешки. И не помню, чтобы сама папка создавалась программой.
НО!
программно можно создавать папку с пробелом в начале имени, а вот система так не дает сделать. код ниже работает
Код:
DirCopy(@DesktopDir & '\copy', @DesktopDir & '\ copy')

результат на скрине. у правой папки пробел в начале имени
считаю, что это недоработка системы. )
 

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    26.6 КБ · Просмотры: 9

IMStrelcov

CTPEJIbLLOB
Сообщения
253
Репутация
64
Мне кажется так будет достаточно:
Ну а как же, вы хоть поняли о чем функция, вы ее хоть запускали?
Я конечно ничего против не имею и не хочу кого либо обидеть, да и тема о другом, но ... .
Но запустите вот это у себя и посмотрите результат моей и вашей функции (а так же время обработки).
Код:
#include <WinAPIShPath.au3>

Func _PathIsValid($sPath)
   Return _WinAPI_PathIsUNC($sPath) Or Not _WinAPI_PathIsFileSpec($sPath)
EndFunc

Func Path_IsCorrect_($_sPath)
   Local $_iResult = StringRegExp($_sPath, '\A\z|[|/\*<>?"\v\t]|((\A([^[:alpha:]]|))|.{2}):|:(\z|[^\\])|\\{2}|\.{2}\z|(\A|\\)\h+|(\.{2,}[\h\.]+|\\\.|[^\.\\]\.+|\h+)(\z|\\)|(\A|\\)\.[^\.\h\\]+(\\|\z)', '')
   Return Not $_iResult
EndFunc

$Path = '.D:\Folder Name\.SubFolder Name\.0'&@LF
$Path &= '  \D:\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= '  :D\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'я:\   Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'DD:\Folder Name   \SubFolder Name\File Name.Type'&@LF
$Path &= 'D:  '&@LF
$Path &= 'D:\Folder Name\    \File Name.Type'&@LF
$Path &= 'D:\Folder Name\ . . . \File Name.Type  . . .'&@LF
$Path &= '\D:\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= ':D\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'я:\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'DD:\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:'&@LF
$Path &= 'D:\Folder Name\:SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\Folder Name\SubFolder Name\File Name.Type:'&@LF
$Path &= '\    \Folder.k'&@LF
$Path &= 'Folder.k'&@LF
$Path &= 'Folder .name'&@LF
$Path &= 'Folder. name'&@LF
$Path &= 'Folder Name\. '&@LF
$Path &= 'Folder Name\.  .'&@LF
$Path &= 'Folder Name\. . '&@LF
$Path &= '. \Folder Name'&@LF
$Path &= '.  .\Folder Name'&@LF
$Path &= '. . \Folder Name'&@LF
$Path &= '.\Folder Name\SubFolder Name'&@LF
$Path &= '..\Folder Name\SubFolder Name'&@LF
$Path &= '...\Folder Name\SubFolder Name'&@LF
$Path &= 'Folder Name\SubFolder Name\.'&@LF
$Path &= 'Folder Name\SubFolder Name\..'&@LF
$Path &= 'Folder Name\SubFolder Name\...'&@LF
$Path &= ' .\Folder Name\SubFolder Name'&@LF
$Path &= 'Folder Name\SubFolder Name\ .'&@LF
$Path &= '..\Folder Name\SubFolder Name\..\..\..\'&@LF
$Path &= '.Folder Name\SubFolder Name\..\..\..\'&@LF
$Path &= 'Folder Name\SubFolder Name\..\..\gg..\'&@LF
$Path &= '..Folder Name\SubFolder Name\..\..\..\'&@LF
$Path &= '...\Folder Name\SubFolder Name\..\..\..\'&@LF
$Path &= 'Folder Name\SubFolder Name\..\..\.'&@LF
$Path &= '.\.\Folder Name\SubFolder Name\..\..\..\'&@LF
$Path &= 'Folder Name\SubFolder Name\'&@LF
$Path &= '.\Folder Name\SubFolder Name\'&@LF
$Path &= '\Folder Name\SubFolder Name\'&@LF
$Path &= 'D:\Folder Name\SubFolder Name\'&@LF
$Path &= 'D:\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\. Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\'&@LF
$Path &= 'D:\. 0'&@LF
$Path &= 'D:\..0'&@LF
$Path &= 'D:\.0.0'&@LF
$Path &= 'D:\.0 0'&@LF
$Path &= 'D:\.0'&@LF
$Path &= 'D:\. '&@LF
$Path &= 'D:\..'&@LF
$Path &= 'D:\Fol>der Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\Folder Name \SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\Folder Name.\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\Folder Name\SubFolder Name\File Name.Type '&@LF
$Path &= 'D:\Folder Name\SubFolder Name\File Name.Type.'&@LF
$Path &= ' D\Folder Name\SubFolder Name\File Name.Type'&@LF
$Path &= '.D\Folder Na.me\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\Folder Name\\SubFolder Name\File Name.Type'&@LF
$Path &= 'D:\Folder Name\ SubFolder Name\File Name.Type'&@LF
$Path = StringSplit($Path, @LF)

$c=0
$t=TimerInit()
For $b=1 To 10
   For $a=1 To $Path[0]
      Path_IsCorrect_($Path[$a])
      $c +=1
   Next
Next
$t=TimerDiff($t)
ConsoleWrite('Path_IsCorrect_() - For: ' & $c&' / Time: '&$t&@LF)

$c=0
$t=TimerInit()
For $b=1 To 10
   For $a=1 To $Path[0]
      _PathIsValid($Path[$a])
      $c +=1
   Next
Next
$t=TimerDiff($t)
ConsoleWrite('_PathIsValid() - For: ' & $c&' / Time: '&$t&@LF)

ConsoleWrite(@LF&@LF&@LF)
ConsoleWrite('_PathIsValid() - Result: '&@LF)
For $z1=1 To $Path[0]-1
   If $Path[$z1] = '' Then
      ConsoleWrite(@LF & @LF & @LF)
      ContinueLoop
   EndIf
   If Not _PathIsValid($Path[$z1]) Then
      ConsoleWrite(StringFormat('%-10s', '-Error: ') & '[' & $Path[$z1] & ']' & @LF)
   Else
      ConsoleWrite(StringFormat('%-10s', '+Ok: ') & '[' & $Path[$z1] & ']' & @LF)
   EndIf
Next

ConsoleWrite(@LF&@LF&@LF)
ConsoleWrite('Path_IsCorrect_() - Result: '&@LF)
For $z1=1 To $Path[0]-1
   If $Path[$z1] = '' Then
      ConsoleWrite(@LF & @LF & @LF)
      ContinueLoop
   EndIf
   If Not Path_IsCorrect_($Path[$z1]) Then
      ConsoleWrite(StringFormat('%-10s', '-Error: ') & '[' & $Path[$z1] & ']' & @LF)
   Else
      ConsoleWrite(StringFormat('%-10s', '+Ok: ') & '[' & $Path[$z1] & ']' & @LF)
   EndIf
Next
 

Oki

Продвинутый
Сообщения
452
Репутация
62
программно можно создавать папку с пробелом в начале имени, а вот система так не дает сделать.
Подчёркнутое ложно: система вполне даёт возможности создать многие имена, которые не позволяет стандартный интерфейс.
Интересен сам факт. В эту папку, что с 2018 года, я вручную копировал файлы с флешки. И не помню, чтобы сама папка создавалась программой.
Это можно сделать массой способов. Например, многие файловые менеджеры не чинят помех ни созданию имён, начинающихся с пробелов, ни даже состоящих только из зарезервированных слов. То же самое имеет место и для команды mkdir из консоли cmd. Запрет работает только при взаимодействии массовых пользователей через интерфейс для чайников.
считаю, что это недоработка системы. )
Наоборот, приятно, когда система позволяет нам делать вещи в обход запретов, существующих для безопасности ламеров. Как была бы жестока Windows, если в ней невозможно было настроить просмотр скрытых и системных папок, расширений файлов и прочих полезностей.
 

IiIr

Новичок
Сообщения
1
Репутация
0
Мне кажется так будет достаточно:

Код:
#include <WinAPIShPath.au3>

ConsoleWrite(_PathIsValid(@SystemDir) & @CRLF)

Func _PathIsValid($sPath)
    Return _WinAPI_PathIsUNC($sPath) Or Not _WinAPI_PathIsFileSpec($sPath)
EndFunc
Для проверки очень даже. Просто и функционально так сказать)
 
Верх