Баг при совпадении короткого и длинного имени

Обсуждение программы nnBackup

Баг при совпадении короткого и длинного имени

Postby Raistlin » Sun, 04 Jul 2010, 16:03

Командная строка:
Code: Select all
nnbackup.exe sync -i H:\Books\ -o G:\Books\ -ad -da -s -v

Лог:
Code: Select all
Su 04.Jul.2010 16:53 Start synchronization
Su 04.Jul.2010 16:53 Copying files
Su 04.Jul.2010 16:53 H:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ\LEM_KI~1.FB2
Su 04.Jul.2010 16:53 Delete files
Su 04.Jul.2010 16:53 Stop synchronization

Содержимое каталога-источника:
Code: Select all
 Volume in drive H is xxxxx
 Volume Serial Number is xxxx-xxxx

 Directory of H:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ

04.07.2010  16:41    <DIR>                       .
04.07.2010  16:41    <DIR>                       ..
03.03.2010  20:28            22 489 LEM_KI~2.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2
03.03.2010  20:28            24 504 LEM_KI~3.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_2_Puteshestvie_pervoe.32507.fb2
03.03.2010  20:28            32 934 LEM_KI~4.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_6_Puteshestvie_pyatoe_ili_O_shalostyah_korolya_Baleriona.32501.fb2
04.07.2010  16:32            32 934              LEM_KI~1.FB2
               4 File(s)        112 861 bytes
               2 Dir(s)   2 745 556 992 bytes free

Содержимое каталога-получателя (после синхронизации):
Code: Select all
 Volume in drive G is xxxxx
 Volume Serial Number is xxxx-xxxx

 Directory of G:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ

31.03.2010  13:38    <DIR>                       .
31.03.2010  13:38    <DIR>                       ..
04.07.2010  16:32            32 934 LEM_KI~1.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2
03.03.2010  20:28            24 504 LEM_KI~2.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_2_Puteshestvie_pervoe.32507.fb2
03.03.2010  20:28            32 934 LEM_KI~3.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_6_Puteshestvie_pyatoe_ili_O_shalostyah_korolya_Baleriona.32501.fb2
               3 File(s)         90 372 bytes
               2 Dir(s)  95 529 926 656 bytes free

При этом errorlevel по окончании копирования 0, хотя синхронизация завершилась неудачей: каталоги различны.
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Re: Баг при совпадении короткого и длинного имени

Postby elos » Mon, 05 Jul 2010, 11:30

Не думаю, что это баг. Это похоже на недопонимание принципов, хотя и сам на звание знатока не претендую.
Чтобы запутаться окончательно, можно почитать про особенности обработки имен файлов Windows в Linux.

Ключ -ad для чего? Существующие файлы периодически правятся, права меняются?

Смущает меня комбинация ключей -ad -da в свете принципов хранения длинных имен файлов и порядка синхронизации с этими ключами...

Диски G: и H: - флешки, сетевые диски? Файловая система на них какая? Информация на источник откуда попадает - с какой ОС и какими методами (файловым менеджером или консольной командой)?

Архив этих файлов скинуть для экспериментов можно?
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Баг при совпадении короткого и длинного имени

Postby Raistlin » Mon, 05 Jul 2010, 12:16

Какое отношение имеют "принципы хранения длинных имен файлов и порядка синхронизации с этими ключами" к комбинации -ad -da? Она означает: "сделай каталог-приемник идентичным каталогу-источнику, ориентируясь на размеры и даты модификации файлов". Программа говорит: "ОК, сделала". А на самом деле - не сделала. Вот и всё. Баг.
Причина конфуза понятна - Far, например, тоже не может в этой ситуации скопировать тот файл в каталог-приемник. Но, в отличие от nnBackup, он сообщает об ошибке.

Внимательно ознакомьтесь с листингами DIR - это поможет и понять суть проблемы, и воспроизвести ситуацию у себя, если будет такое желание. Непосредственно те файлы для этого не нужны. Я, например, только что снова воспроизвел этот баг - искусственно, на другом наборе файлов.

И давайте оставим покровительственно-поучительный тон, хорошо? Не исключено, что "в понимании принципов" я вам и фору дать могу.
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Re: Баг при совпадении короткого и длинного имени

Postby elos » Mon, 05 Jul 2010, 12:45

Тогда просто - эти 4 файла скинуть можешь? чтоб всё "добуквенно" воспроизвести! (пока день отпуска ещё есть)...

P.S. Личку посмотри.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Баг при совпадении короткого и длинного имени

Postby Raistlin » Mon, 05 Jul 2010, 13:25

Да нет уже этих файлов. Обнаружил баг, написал сюда и стёр лишний файл.
Для воспроизведения: создай два каталога. В каталоге 1 создай файл Long name.txt. В каталоге 2 - LONGNA~1.TXT. Затем скопируй Long name.txt в каталог 2 и попробуй синхронизировать каталоги (каталог 2 - источник).
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Re: Баг при совпадении короткого и длинного имени

Postby elos » Mon, 05 Jul 2010, 23:38

Таки да - я обиделся как пацан. Убил полдня - чтобы "не давать фору" мне, непутёвому...

Заранее хочу предупредить - лучше логи скопируйте хотя бы в редактор FAR-а, чтобы "развернуть" строки. А то смотреть вывод консоли с "заворачивающимися" строчками как-то некошерно...

Всё про "Длинные и короткие имена файлов" - смотрим всё, написанное жирным шрифтом.
Для больших подробностей вчитываемся в принципы хранения длинных имен файлов.
Особенно будем внимательны к выделенному абзацу:
Внимание! Необходимо внимательно подходить к использованию групповых символов типа * и ? вместе с командами del и copy. При выполнении этих команд NTFS работает и с длинным и с коротким именем файла; таким образом могут быть удалены или скопированы лишние файлы.

Но лучше всего объясняется все в статье Файловая система на уровне редиректора операционной системы (2.3 VFAT):
В длинных именах разница между прописными и строчными буквами сохраняется - это позволяет обеспечить удобочитаемость файлов. Однако в одном каталоге недопустимы имена файлов, различающихся только регистром (т.е. строчными и прописными) букв и более ничем! Это объясняется алгоритмом преобразования длинных имен к коротким, о котором смотри пункт 2. По другому это можно сформулировать так: в одном каталоге не могут находится одновременно два файла или каталога с одинаковыми короткими именами.


Теперь подробности...
Сначала создадим в FAR-е стуктуру папок из начального поста и создадим файлы аналогичного размера (кроме одного). Создание файлов начнём с LEM_KI~1.FB2 (его то и сделаем размером 22222 byte). Источник расположим на диске C:, приёмник будет на диске D:. Далее идёт полный лог консоли:
Code: Select all
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\elos>cd "C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ"

C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ>dir/x
 Том в устройстве C имеет метку SYSTEM
 Серийный номер тома: 0444-967C

 Содержимое папки C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ

05.07.2010  19:35    <DIR>                       .
05.07.2010  19:35    <DIR>                       ..
05.07.2010  19:33            32 934 LEM_KI~2.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2
05.07.2010  19:13            24 504 LEM_KI~3.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_2_Puteshestvie_pervoe.32507.fb2
05.07.2010  19:15            32 934 LEM_KI~4.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_6_Puteshestvie_pyatoe_ili_O_shalostyah_korolya_Baleriona.32501.fb2
05.07.2010  20:01            22 222              LEM_KI~1.FB2
               4 файлов        112 594 байт
               2 папок  10 305 540 096 байт свободно

C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ>C:\nnBackup\nnbackup.exe sync -i C:\Books\ -o d:\Books\ -ad -da -s -v -log
nnBackup. V 3.01 RC10 Build 140 2010-01-28 14:27
Copyright (C) 2001-2010 nnSoft. nemtsev@nncron.ru
2010.07.05 23:10 Start synchronization
2010.07.05 23:10 Копирование файлов
2010.07.05 23:10 C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ\Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2
2010.07.05 23:10 C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ\Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_2_Puteshestvie_pervoe.32507.fb2
2010.07.05 23:10 C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ\Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_6_Puteshestvie_pyatoe_ili_O_shalostyah_korolya_Baleriona.32501.fb2
2010.07.05 23:10 C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ\LEM_KI~1.FB2
2010.07.05 23:10 Удаление файлов
2010.07.05 23:10 Stop synchronization

C:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ>d:

D:\>cd "D:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ"

D:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ>dir/x
 Том в устройстве D имеет метку works
 Серийный номер тома: F471-A510

 Содержимое папки D:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ

05.07.2010  23:10    <DIR>                       .
05.07.2010  23:10    <DIR>                       ..
05.07.2010  20:01            22 222 LEM_KI~1.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2
05.07.2010  19:13            24 504 LEM_KI~2.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_2_Puteshestvie_pervoe.32507.fb2
05.07.2010  19:15            32 934 LEM_KI~3.FB2 Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_6_Puteshestvie_pyatoe_ili_O_shalostyah_korolya_Baleriona.32501.fb2
               3 файлов         79 660 байт
               2 папок   3 583 898 624 байт свободно

D:\Books\Станислав Лем - ПСС [1960-2008, fb2]\С Лем\НАУЧНАЯ ФАНТАСТИКА\КИБЕРИАДА-СЕМЬ ПУТЕШЕСТВИЙ ТРУРЛЯ И КЛАПАУЦИЯ>

Обратим внимание на источник - первоначально созданный файл LEM_KI~1.FB2 не имеет короткого имени!.
Также смотрим как шло копирование. Скопировались все файлы! Файлы копировались, начиная с длинных имен, а LEM_KI~1.FB2 здесь как бы "длинное имя". Но вот в момент записи используемый WinAPI-вызов(я в этов, конечно, не уверен, но думаю, что это так - надо искать в исходниках библиотек) смотрит и на "короткие имена" файлов. А файл Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2 к этому моменту уже имеет совпадающее короткое имя. Как уж там работает Win-процедура, но происходит перезапись файла без всяких предупреждений ("без упирания лбом в ворота" - это же не стандартная утилита windows, где это проверка и предупреждение встроено).

Теперь осталось объяснить исчезновение в приёмнике файла LEM_KI~1.FB2. Честно говоря я уже запутался, читая эти три статьи, да ещё вспоминая про ключ -da...
Теперь экспромт воспаленного мозга... Ключ -da здесь просто не работает никак. Здесь как-то задействованы структуры файловой системы. Да, на диске LEM_KI~1.FB2 не имеет "короткого имени". Но в момент чтения в память windows должна его создать (в памяти). При записи этого короткого имени windows видит что в приёмнике такое имя уже есть и прописывает источник на "свое" родное место (Lem_Kiberiada-Sem_puteshestviy_Trurlya_i_Klapautsiya_1_Puteshestvie_pervoe_ili_lovushka_Gargantsiana.32506.fb2), согласно короткому имени, перезаписывая содержимое файла.

Как-то вот так! Багом это не считаю - это нормальный результат использования автором WinAPI (так и не посмотрел ещё в исходники), плюс подвернувшиеся файлы (или созданные вручную для эксперимента из-за какого-то случая - уж очень размеры совпадают) - надо же как-то совместимость с FAT поддерживать... У меня таких проблем просто не возникало, так как я их просто давил в зародыше - русский старался не употреблять в именах (это можно сделать или в комментариях файла или в дополнительных описаниях), как и не смешивал русский с английским в путях (как наши доблестные программеры - смешать в имени русским с английским, да ещё в разных кодировках - тоже не делаю), формат 8.3 применяю для временных файлов (в основном), в имени пробелов у меня просто нет, ниже FAT32 не опускался. Самостоятельно более трёх вложений папок не делал - остальное от вложенности сохраняемых дистрибутивов зависело. Программы разной битности также "не мешаю" в суповой набор.

Степень моих (старого уже падавана) затраченных усилий на предоставление полной информации по воспроизведению бага, с приведёнными ссылками и и рассуждениями без намеков на некомпетенцию - лично Вас, Raistlin, удовлетворяет? Логи могли бы быть раза в два-три больше, просто укоротил для показа результата, подкоректировав размер файла для наглядности. На истину в последней инстанции не претендую.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Баг при совпадении короткого и длинного имени

Postby Raistlin » Tue, 06 Jul 2010, 15:11

Затраченные вами усилия, безусловно, уважение вызывают. Однако методология, анализ результатов и выводы - хромают. Давайте воспроизведем ситуацию еще раз, одновременно и упростив ее, и усложнив. Создадим файл Test.cmd:
Code: Select all
@echo off
md C:\Temp\1

echo Same timestamp, same size, short name > C:\Temp\1\WITHOU~1.TXT
echo Same timestamp, same size, long_ name > "C:\Temp\1\Without pause.txt"

echo Different timestamp, same size, short name > C:\Temp\1\WITHPA~1.TXT
ping -n 2 127.0.0.0 > nul
echo Different timestamp, same size, long_ name > "C:\Temp\1\With pause.txt"

echo Same timestamp, different size, short name > C:\Temp\1\DIFFER~1.TXT
echo Same timestamp, different size, long name > "C:\Temp\1\Different sizes.txt"

echo Same timestamp, same size, upper case, short name > C:\Temp\1\UPPERC~1.TXT
echo Same timestamp, same size, upper case, long_ name > "C:\Temp\1\UPPERCASE.txt"

dir /x C:\Temp\1
echo.
cd C:\Temp\1
for %%A in (*.txt) do (
   echo Contents of %%~fA:
   type "%%~fA"
   echo.
)
nnbackup.exe sync -i C:\temp\1\ -o C:\temp\2\ -ad -da -v
echo.
dir /x C:\Temp\2
cd C:\Temp\2
for %%A in (*.txt) do (
   echo.
   echo Contents of %%~fA:
   type "%%~fA"
)

Выполнив его, получим:
Code: Select all
 Volume in drive C has no label.
 Volume Serial Number is 4B23-279D

 Directory of C:\Temp\1

06.07.2010  15:37    <DIR>                       .
06.07.2010  15:37    <DIR>                       ..
06.07.2010  15:37                44 DIFFER~2.TXT Different sizes.txt
06.07.2010  15:37                45              DIFFER~1.TXT
06.07.2010  15:37                52 UPPERC~2.TXT UPPERCASE.txt
06.07.2010  15:37                52              UPPERC~1.TXT
06.07.2010  15:37                45 WITHPA~2.TXT With pause.txt
06.07.2010  15:37                40 WITHOU~2.TXT Without pause.txt
06.07.2010  15:37                40              WITHOU~1.TXT
06.07.2010  15:37                45              WITHPA~1.TXT
               8 File(s)            363 bytes
               2 Dir(s)  74 558 824 448 bytes free

Contents of C:\temp\1\Different sizes.txt:
Same timestamp, different size, long name

Contents of C:\temp\1\DIFFER~1.TXT:
Same timestamp, different size, short name

Contents of C:\temp\1\UPPERCASE.txt:
Same timestamp, same size, upper case, long_ name

Contents of C:\temp\1\UPPERC~1.TXT:
Same timestamp, same size, upper case, short name

Contents of C:\temp\1\With pause.txt:
Different timestamp, same size, long_ name

Contents of C:\temp\1\Without pause.txt:
Same timestamp, same size, long_ name

Contents of C:\temp\1\WITHOU~1.TXT:
Same timestamp, same size, short name

Contents of C:\temp\1\WITHPA~1.TXT:
Different timestamp, same size, short name

nnBackup. V 3.01 RC8 Build 137 2008-12-30 15:03
Copyright (C) 2001-2010 nnSoft. nemtsev@nncron.ru
Зарегистрирован только для некоммерческого использования
Registered for non-commercial use only
Tu 06.Jul.2010 15:37 Start synchronization
Tu 06.Jul.2010 15:37 Copying files
Tu 06.Jul.2010 15:37 C:\temp\1\Different sizes.txt
Tu 06.Jul.2010 15:37 C:\temp\1\DIFFER~1.TXT
Tu 06.Jul.2010 15:37 C:\temp\1\UPPERCASE.txt
Tu 06.Jul.2010 15:37 C:\temp\1\UPPERC~1.TXT
Tu 06.Jul.2010 15:37 C:\temp\1\With pause.txt
Tu 06.Jul.2010 15:37 C:\temp\1\Without pause.txt
Tu 06.Jul.2010 15:37 C:\temp\1\WITHPA~1.TXT
Tu 06.Jul.2010 15:37 Delete files
Tu 06.Jul.2010 15:37 Stop synchronization

 Volume in drive C has no label.
 Volume Serial Number is 4B23-279D

 Directory of C:\Temp\2

06.07.2010  15:37    <DIR>                       .
06.07.2010  15:37    <DIR>                       ..
06.07.2010  15:37                45 DIFFER~1.TXT Different sizes.txt
06.07.2010  15:37                52 UPPERC~1.TXT UPPERCASE.txt
06.07.2010  15:37                45 WITHPA~1.TXT With pause.txt
06.07.2010  15:37                40 WITHOU~1.TXT Without pause.txt
               4 File(s)            182 bytes
               2 Dir(s)  74 558 803 968 bytes free

Contents of C:\temp\2\Different sizes.txt:
Same timestamp, different size, short name

Contents of C:\temp\2\UPPERCASE.txt:
Same timestamp, same size, upper case, short name

Contents of C:\temp\2\With pause.txt:
Different timestamp, same size, short name

Contents of C:\temp\2\Without pause.txt:
Same timestamp, same size, long_ name

Интересный результат, да? В трех парах из четырех содержимое "длинноименного" файла перезаписалось содержимым "короткоименного". Но никакой таинственности в этом факте нет - всё достаточно очевидно. Как и то, что иногда, запустив Test.cmd, можно получить и другой результат - содержимое "длинноименного" файла будет перезаписано содержимым "короткоименного" во всех четырех парах. Если очевидно все-таки недостаточно - напишите, я с удовольствием поясню.

Да, и как вы ответите теперь на изначальный вопрос - баг это или не баг? Если результат зависит от стольких факторов? Причем баг-то именно в nnBackup - не учтены особенности работы WinAPI с короткими и длинными именами файлов.
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Re: Баг при совпадении короткого и длинного имени

Postby elos » Tue, 06 Jul 2010, 18:12

Прошу "разжевать" очевидное поподробнее - предпочитаю в старом возрасте уже хорошо "пережёванное" другими. От букварей никогда не отказывался. Пока из исходников spf 4.18 и nnbackup какой-то давности:

C:\nnDOC\source_nn\backup2\winapi.f
Code: Select all
WINAPI: MoveFileA KERNEL32.DLL


D:\SPF\src\win\spf_win_proc.f
Code: Select all
WINAPI: GetStdHandle                  KERNEL32.DLL
WINAPI: GetLastError                  KERNEL32.DLL
WINAPI: GetFileAttributesA            KERNEL32.DLL
WINAPI: CloseHandle                   KERNEL32.DLL

WINAPI: CreateFileA                   KERNEL32.DLL
WINAPI: DeleteFileA                   KERNEL32.DLL

WINAPI: SetFilePointer                KERNEL32.DLL
WINAPI: GetFileSize                   KERNEL32.DLL

WINAPI: ReadFile                      KERNEL32.DLL
WINAPI: WriteFile                     KERNEL32.DLL

WINAPI: SetEndOfFile                  KERNEL32.DLL
WINAPI: ExitProcess                   KERNEL32.DLL
WINAPI: ExitThread                    KERNEL32.DLL     
WINAPI: GetNumberOfConsoleInputEvents KERNEL32.DLL
WINAPI: ReadConsoleInputA             KERNEL32.DLL
WINAPI: GetProcessHeap                KERNEL32.DLL
WINAPI: HeapCreate                    KERNEL32.DLL
WINAPI: HeapDestroy                   KERNEL32.DLL
WINAPI: HeapAlloc                     KERNEL32.DLL
WINAPI: HeapFree                      KERNEL32.DLL
WINAPI: HeapReAlloc                   KERNEL32.DLL
WINAPI: GetCommandLineA               KERNEL32.DLL
WINAPI: LoadLibraryA                  KERNEL32.DLL
WINAPI: GetProcAddress                KERNEL32.DLL
WINAPI: CharToOemBuffA                USER32.DLL
WINAPI: OemToCharBuffA                USER32.DLL
WINAPI: GetModuleFileNameA            KERNEL32.DLL
WINAPI: GetEnvironmentVariableA       KERNEL32.DLL
WINAPI: CreateThread                  KERNEL32.DLL
WINAPI: SuspendThread                 KERNEL32.DLL
WINAPI: ResumeThread                  KERNEL32.DLL
WINAPI: TerminateThread               KERNEL32.DLL
WINAPI: Sleep                         KERNEL32.DLL
WINAPI: FlushFileBuffers              KERNEL32.DLL

Баг или нет - попросил в личке автора посмотреть данную тему.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Баг при совпадении короткого и длинного имени

Postby Raistlin » Tue, 06 Jul 2010, 23:35

А разгадка вот в чем. nnBackup при обработке маски перебирает файлы, ей соответствующие, в порядке сортировки. Различными файлы считаются, если у них различаются размеры и/или время модификации. Т. к. каталог-приёмник для каждой пары изначально, так сказать, пуст (нет там файлов с такими же именами, что у пары, - ни короткими, ни длинными), то первый по порядку сортировки файл из пары будет туда скопирован без вопросов. Смотрим пары.
  1. Code: Select all
    echo Same timestamp, same size, short name > C:\Temp\1\WITHOU~1.TXT
    echo Same timestamp, same size, long_ name > "C:\Temp\1\Without pause.txt"
    Without pause.txt скопируется (он по алфавиту раньше идет), а WITHOU~1.TXT - будет пропущен, ибо ничем от уже присутствующего в каталоге-приемнике Without pause.txt не отличается: время, размер, короткое имя - одинаковы, а длинного у него нет. Правда, время может и отличаться, если создание файлов произойдет в разные секунды (или какова там точность сравнения?) - тогда файл WITHOU~1.TXT заменит Without pause.txt. Но длинное имя сохранится - видимо, здесь проявляется особенность WinAPI; по крайней мере, при использовании COPY оно также сохраняется.
  2. Code: Select all
    echo Different timestamp, same size, short name > C:\Temp\1\WITHPA~1.TXT
    ping -n 2 127.0.0.0 > nul
    echo Different timestamp, same size, long_ name > "C:\Temp\1\With pause.txt"
    Время модификации различается - содержимое WITHPA~1.TXT заменит содержимое With pause.txt. Длинное имя на месте.
  3. Code: Select all
    echo Same timestamp, different size, short name > C:\Temp\1\DIFFER~1.TXT
    echo Same timestamp, different size, long name > "C:\Temp\1\Different sizes.txt"
    Размеры различны - результат тот же, что в предыдущем случае.

С последней парой я перемудрил - она ведет себя так же, как и первая, чего и следовало ожидать. А вот что я на самом деле имел тогда в виду. Test.cmd:
Code: Select all
@echo off
md C:\Temp\1

echo Same timestamp, same size, cyrillic letter, short name > C:\Temp\1\LETTER~1.TXT
echo Same timestamp, same size, cyrillic letter, long_ name > "C:\Temp\1\LetterЯЯЯ.txt"

dir /x C:\Temp\1
echo.
cd C:\Temp\1
for %%A in (*.txt) do (
   echo Contents of %%~fA:
   type "%%~fA"
   echo.
)
nnbackup.exe sync -i C:\temp\1\ -o C:\temp\2\ -ad -da -v
echo.
dir /x C:\Temp\2
cd C:\Temp\2
for %%A in (*.txt) do (
   echo.
   echo Contents of %%~fA:
   type "%%~fA"
)

Результат:
Code: Select all
 Volume in drive C has no label.
 Volume Serial Number is 4B23-279D

 Directory of C:\Temp\1

07.07.2010  00:22    <DIR>                       .
07.07.2010  00:22    <DIR>                       ..
07.07.2010  00:22                57              LETTER~1.TXT
07.07.2010  00:22                57 LETTER~2.TXT LetterЯЯЯ.txt
               2 File(s)            114 bytes
               2 Dir(s)  74 532 716 544 bytes free

Contents of C:\temp\1\LETTER~1.TXT:
Same timestamp, same size, cyrillic letter, short name

Contents of C:\temp\1\LetterЯЯЯ.txt:
Same timestamp, same size, cyrillic letter, long_ name

nnBackup. V 3.01 RC8 Build 137 2008-12-30 15:03
Copyright (C) 2001-2010 nnSoft. nemtsev@nncron.ru
Зарегистрирован только для некоммерческого использования
Registered for non-commercial use only
We 07.Jul.2010 00:22 Start synchronization
We 07.Jul.2010 00:22 Copying files
We 07.Jul.2010 00:22 C:\temp\1\LETTER~1.TXT
We 07.Jul.2010 00:22 C:\temp\1\LetterЯЯЯ.txt
We 07.Jul.2010 00:22 Delete files
We 07.Jul.2010 00:22 Stop synchronization

 Volume in drive C has no label.
 Volume Serial Number is 4B23-279D

 Directory of C:\Temp\2

07.07.2010  00:22    <DIR>                       .
07.07.2010  00:22    <DIR>                       ..
07.07.2010  00:22                57              LETTER~1.TXT
07.07.2010  00:22                57 LETTER~2.TXT LetterЯЯЯ.txt
               2 File(s)            114 bytes
               2 Dir(s)  74 532 687 872 bytes free

Contents of C:\temp\2\LETTER~1.TXT:
Same timestamp, same size, cyrillic letter, short name

Contents of C:\temp\2\LetterЯЯЯ.txt:
Same timestamp, same size, cyrillic letter, long_ name

"Я" идет в таблице символов после тильды, поэтому "короткоименный" файл скопировался первым.

Вот так. Чудес никаких - все логично. Но баг налицо: каталоги различны, а программа сообщает, что синхронизация успешна. Да, средствами WinAPI узнать о проблеме нельзя - значит, нужен workaround. Например, подсчет файлов в каталоге-источнике и каталоге-приемнике.
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42

Re: Баг при совпадении короткого и длинного имени

Postby Raistlin » Wed, 01 May 2013, 00:33

Почти три года позади, и вот снова столкнулся с проблемой, вызванной недостатками работы nnBackup с каталогами, содержащими длинные и короткие имена. Сколько я ни синхронизирую два каталога, в логе каждый раз вижу синхронизацию четырех файлов:
Code: Select all
nnBackup. V 3.02b3 Build 147 2012-03-22 13:37
Copyright (C) 2001-2013 nnSoft. nemtsev@nncron.ru
We 01.May.2013 00:25 Start synchronization
We 01.May.2013 00:25 Delete files
We 01.May.2013 00:35 Copying files
We 01.May.2013 00:35 ERROR # 5: K:\Admin\~Links\* ==> E:\Admin\~Links\*: Access is denied.
We 01.May.2013 00:39 K:\Books\_Рукоделие\_Журналы\dolls1\ANGEL AZUL, Y OTRAS MUNECAS\ANGEL-~21.jpg
We 01.May.2013 00:39 K:\Books\_Рукоделие\_Журналы\dolls1\ANGEL AZUL, Y OTRAS MUNECAS\ANGEL-~22.jpg
We 01.May.2013 00:39 K:\Books\_Рукоделие\_Журналы\dolls1\ANGEL AZUL, Y OTRAS MUNECAS\ANGEL-~3.JPG
We 01.May.2013 00:39 K:\Books\_Рукоделие\_Журналы\dolls1\ANGEL AZUL, Y OTRAS MUNECAS\ANGEL-~4.JPG
We 01.May.2013 00:45 Stop synchronization

Причина здесь вот в чем. Содержимое каталога-источника таково:
Code: Select all
22.05.2010  16:50            16 329 ANGEL-~1.JPG
22.05.2010  16:50            15 085 ANGEL-~2.JPG
22.05.2010  16:50            21 047 ANGEL-~21.jpg
22.05.2010  16:50            12 619 ANGEL-~22.jpg
22.05.2010  16:50            18 338 ANGEL-~23.jpg
22.05.2010  16:50            24 221 ANGEL-~3.JPG
22.05.2010  16:50            12 830 ANGEL-~31.jpg
22.05.2010  16:50            16 420 ANGEL-~4.JPG
22.05.2010  16:50            20 789 ANGEL-~41.jpg
               9 File(s)        157 678 bytes
               0 Dir(s)  549 190 955 008 bytes free

А вот что получается в каталоге-результате после синхронизации (он был сначала пустым):
Code: Select all
22.05.2010  16:50            16 329 ANGEL-~1.JPG
22.05.2010  16:50            15 085 ANGEL-~2.JPG
22.05.2010  16:50            24 221 ANGEL-~21.jpg
22.05.2010  16:50            16 420 ANGEL-~22.jpg
22.05.2010  16:50            18 338 ANGEL-~23.jpg
22.05.2010  16:50            12 830 ANGEL-~31.jpg
22.05.2010  16:50            20 789 ANGEL-~41.jpg
               7 File(s)        124 012 bytes
               0 Dir(s)  549 038 751 744 bytes free

Файлы синхронизируются в порядке сортировки. При копировании файлы ANGEL-~21.jpg и ANGEL-~22.jpg должны получить новые короткие имена. Имена ANGEL-~1.JPG и ANGEL-~2.JPG заняты (соответствующие файлы уже скопированы в целевой каталог), значит, система им присваивает имена ANGEL-~3.JPG и ANGEL-~4.JPG. Затем nnBackup синхронизирует "настоящие" файлы ANGEL-~3.JPG и ANGEL-~4.JPG. И тут уже получается полная фигня: файлы замещаются - и получают длинные имена от старых файлов. nnBackup рапортует об успешной синхронизации, а на самом деле каталоги различны по количеству файлов, и одноименные файлы в них тоже отличаются.

Здесь нужен workaround. Сначала нужно синхронизировать файлы, у которых длинные имена соответствуют стандарту 8.3 и его ограничениям типа отсутствия пробелов (то есть, очевидно, те, у которых длинные и короткие имена совпадают). Затем - все остальные файлы.
Windows XP SP3 Corp. + MUI, nnCron 1.93.1125.14, nnBackup 3.02b3 Build 147

Magically yours
Raistlin
User avatar
Raistlin
 
Posts: 159
Joined: Wed, 03 Nov 2004, 12:42


Return to nnBackup forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest