Тотальная неудачница и убийца жёстких дисков.
#post-id: 8011-22-15
#original-date: 2.07.2022 Sat
#original-time: 10:15 PM
#original-day: 8011
#original-host: WinXP Home SP3 (Build 2600)
NAS Seagate GoFlex Home, винт в NTFS, по сети через самбу выдаётся NTFS.
Неожиданно начинает глючить Theme Pictures: конфиг есть, вон он, рядом с екзешником, но программа думает, что его нет, не читает из него настройки и не сохраняет их. Более того, та же фигня происходит с файлом, в котором хранится список каталогов, куда программа копировала картинки. Ситуация осложняется тем, что конфиг пишется стандартными INI фаункциями, а список – функциями VB6.
Начинаю выяснять, как оно там пишется. Сначала программа получает имя INI файла (потому что настройки грузятся при старте программы). Оказывается, что сначала имя конфига строится так: «C:\Byaka\Program.EXE:Program.INI». Тоесть, сначала предполагается, что конфиг живёт в файловом потоке, а следом делается GetFileAttributes(), которая возвращает -1, если искомого файла нет (или он заблокирован, как какой-нибудь PageFile.SYS).
/* Поэтому в своих функциях вида asIsFileExist() я сначала делаю GetFileAttributes(), а потом, если она возвращает -1, проверяю, нет ли ошибки ERROR_SHARING_VIOLATION, и, если она есть, делаю FindFirstFile(). */
И вот тут оказывается, что функция возвращает 0x00000020, тоесть FILE_ATTRIBUTE_ARCHIVE. Тоесть поток как бы есть, и программа дальше использует его. Но на самом деле драйвер системы на NAS никакие потоки не поддерживает, и чтение-запись INI файла и файла списка проваливается (имя файла списка выбирается по подобию INI файла). Но, поскольку, INI функции просто используются без проверки, сломалось там что-то или нет, а ошибки при чтении списока просто подавляются, всё выглядит очень странно.
Надо думать, что делать с такой засадой.
#upd(3.07.2022 - 12:09 AM):
Интересно, что GetVolumeInformation() для шары не возвращает FILE_NAMED_STREAMS, тоесть потоки не поддерживаются. Впрочем оно и FILE_UNICODE_ON_DISK не возвращает, зато FILE_PERSISTENT_ACLS – возвращает, хотя никакие ACL напрямую не поддерживаются. Тоесть на самом диске структуры присутствуют, но воздействовать программно на них нельзя.
#original-date: 2.07.2022 Sat
#original-time: 10:15 PM
#original-day: 8011
#original-host: WinXP Home SP3 (Build 2600)
NAS Seagate GoFlex Home, винт в NTFS, по сети через самбу выдаётся NTFS.
Неожиданно начинает глючить Theme Pictures: конфиг есть, вон он, рядом с екзешником, но программа думает, что его нет, не читает из него настройки и не сохраняет их. Более того, та же фигня происходит с файлом, в котором хранится список каталогов, куда программа копировала картинки. Ситуация осложняется тем, что конфиг пишется стандартными INI фаункциями, а список – функциями VB6.
Начинаю выяснять, как оно там пишется. Сначала программа получает имя INI файла (потому что настройки грузятся при старте программы). Оказывается, что сначала имя конфига строится так: «C:\Byaka\Program.EXE:Program.INI». Тоесть, сначала предполагается, что конфиг живёт в файловом потоке, а следом делается GetFileAttributes(), которая возвращает -1, если искомого файла нет (или он заблокирован, как какой-нибудь PageFile.SYS).
/* Поэтому в своих функциях вида asIsFileExist() я сначала делаю GetFileAttributes(), а потом, если она возвращает -1, проверяю, нет ли ошибки ERROR_SHARING_VIOLATION, и, если она есть, делаю FindFirstFile(). */
И вот тут оказывается, что функция возвращает 0x00000020, тоесть FILE_ATTRIBUTE_ARCHIVE. Тоесть поток как бы есть, и программа дальше использует его. Но на самом деле драйвер системы на NAS никакие потоки не поддерживает, и чтение-запись INI файла и файла списка проваливается (имя файла списка выбирается по подобию INI файла). Но, поскольку, INI функции просто используются без проверки, сломалось там что-то или нет, а ошибки при чтении списока просто подавляются, всё выглядит очень странно.
Надо думать, что делать с такой засадой.
#upd(3.07.2022 - 12:09 AM):
Интересно, что GetVolumeInformation() для шары не возвращает FILE_NAMED_STREAMS, тоесть потоки не поддерживаются. Впрочем оно и FILE_UNICODE_ON_DISK не возвращает, зато FILE_PERSISTENT_ACLS – возвращает, хотя никакие ACL напрямую не поддерживаются. Тоесть на самом диске структуры присутствуют, но воздействовать программно на них нельзя.