П>Смотрю свойства в проводнике — а он мне говорит, что это папка с файлами, и что у неё стоит атрибут "только для чтения"
Для информации: в Проводнике атрибуты каталогов не отображаются, там консолидируются атрибуты внутри лежащих файлов.
Касательно исходной проблемы, ситуация странная, конкретных идей относительно источника проблемы нет. Я бы начал последовательно устранять все потенциальные источники:
а) Избавиться от всяких string'ов и преобразований, передать тупо константную сишную строку с целевым путём. Вообще, лучше написать отдельную сишную прожку, которая вызывает эту функцию и печатает ответ, и больше вообще ничего не делает. А то мало ли какие сайд-эффекты от другого кода могут быть.
б) Проверить GetFileAttributesW.
в) Проверить GetFileAttributesExA/W.
г) Убедиться, что это не reparse point. Конечно, должен был бы присутствовать FILE_ATTRIBUTE_REPARSE_POINT=0x400, но шут его знает…
д) Диск F: — самый обычный локальный раздел, NTFS? Промежуточные элементы этого пути тоже не являются какими-нибудь точками монтирования или симлинками чёрт знает куда?
П>А с чего его проверять? Проверяется результат вызова GetFileAttributesA на INVALID_FILE_ATTRIBUTES, и там всё нормасик.
Как я понял, был ещё и запуск без отладчика, где не очевидно по какому условию функция вернула false.
Поэтому имеет смысл хотя бы трассировку GetLastError() производить.
Добавлю также, что:
1) отладка может идти в другом security контексте, чем запуск без отладки, что может влиять на успешность чтения атрибутов
2) листинг родительской директории тоже требует иных прав, чем чтение метаданных отдельного подкаталога/файла
Здравствуйте, CaptainFlint, Вы писали:
CF>г) Убедиться, что это не reparse point. Конечно, должен был бы присутствовать FILE_ATTRIBUTE_REPARSE_POINT=0x400, но шут его знает…
Не reparse point
CF>д) Диск F: — самый обычный локальный раздел, NTFS? Промежуточные элементы этого пути тоже не являются какими-нибудь точками монтирования или симлинками чёрт знает куда?
Самый простой тупой путь на локальном HDD диске NTFS, никаких точек монтирования и репарс поинтс там нет, тупо каталог в NTFS файловой системе
Сделал обходняк через FindFirstFile, работает
Потом все твои остальные идеи возможно проверю, но пока FindFirstFile работает нормас
Здравствуйте, m2user, Вы писали:
M>Как я понял, был ещё и запуск без отладчика, где не очевидно по какому условию функция вернула false.
Конечно был.
M>Поэтому имеет смысл хотя бы трассировку GetLastError() производить.
Но какой смысл следить за GetLastError(), если функция АПИ отработала без ошибок?
M>Добавлю также, что: M>1) отладка может идти в другом security контексте, чем запуск без отладки, что может влиять на успешность чтения атрибутов M>2) листинг родительской директории тоже требует иных прав, чем чтение метаданных отдельного подкаталога/файла
M>Впрочем ситуацию это не объясняет.
Здравствуйте, Слава, Вы писали:
П>>Есть каталог, я в него хожу туда-сюда, хоть в фаре, хоть в проводнике.
С>Попробовать добиться стабильного воспроизведения, потом смотреть на ProcessMonitor.
Ну, вполне стабильно воспроизводится. А что смотреть в ProcessMonitor?
С>А ещё, не стоит ли у вас антивируса? А от MS?
Сторонних нет, родной дефендер или как его — стоит, чего-то вроде проверяет
Здравствуйте, CaptainFlint, Вы писали:
CF>Для информации: в Проводнике атрибуты каталогов не отображаются, там консолидируются атрибуты внутри лежащих файлов.
Разве?
У меня в том каталоге нет вообще никаких файлов, но проводник показывает, что только для чтения. Но создавать там файлы и удалять их, а также читать/писать я могу
Здравствуйте, пффф, Вы писали:
CF>>Для информации: в Проводнике атрибуты каталогов не отображаются, там консолидируются атрибуты внутри лежащих файлов.
П>Разве?
П>У меня в том каталоге нет вообще никаких файлов, но проводник показывает, что только для чтения. Но создавать там файлы и удалять их, а также читать/писать я могу
У "только для чтения" он показывает не выставленное состояние (галочку), а неопределённое (заполненный квадратик). В диалоге свойств папки эта опция применяется не для показа, а только для изменения атрибутов, причём не самого каталога, а именно внутри лежащих файлов, что подчёркивается текстом у этого контрола ("Read-only (Only applies to files in fodler)"). Проверить и/или поменять атрибут "только для чтения" самого каталога через этот диалог невозможно, нужны другие инструменты (командная строка, нормальные файловые менеджеры). Несмотря на то, что при попытке выставить галочку он предлагает диалог с вариантом "Apply changes to this folder, subfolder and files" — это он врёт, "только для чтения" применится только к файлам. (Как я понимаю, просто задействовали одинаковый диалог подтверждения для разных ситуаций.)
Кроме того, атрибут "только для чтения" у каталога не означает, что туда нельзя писать. Собственно, для каталога этот атрибут вообще ничего не значит; по крайней мере, сейчас. Уже не помню, как было в MS-DOS. Конкретно в Проводнике этот атрибут каталога (наравне с "системным") может применяться как маркер стилизации: если этот атрибут выставлен и в каталоге имеется файл desktop.ini со спец-информацией, то к каталогу будут применены стили, заданные в этом desktop.ini (значок, описание, фон и пр.).
Обнаружил такую фигню: если сам создаю каталог через CreateDirectoryA/CreateDirectoryW — атрибут каталога не создаётся. Но и Far и проводник видят каталог, можно файлы создавать, нормальный каталог в общем. Но потом когда я делаю либо FindFirstFile, либо GetFileAttributes — то флага FILE_ATTRIBUTE_DIRECTORY там нет. Само собой, при создании каталога я не устанавливаю этот атрибут