VB6- fileLen не возвращает правильное значение

#vb6

#vb6

Вопрос:

Я беру на себя старый код в VB6.

Чтобы повысить надежность, я добавил тест на размер файла перед его чтением.

 length = FileLen("c:Program Files (x86)xxxxfile.ini")
  

Очевидно, что файл существует, иначе я бы не спрашивал на форуме.

При запуске кода в Windows XP работает нормально. При запуске кода под Windows 10 length=0 .

Есть какие-нибудь подсказки?

Комментарии:

1. У меня нет решения, но я могу подтвердить, что это не общая проблема с Windows 10. У меня есть среда Windows 10 с VB6, и я протестировал функцию fileLen с несколькими INI-файлами на компьютере (в папке Windows и Program Files), и она смогла вернуть правильный размер.

2. Это должно сработать; это звучит как проблема с разрешением. Как насчет других файлов в C:Program Папка Files (x86) , работает ли fileLen ?

3. изменено разрешение на общий доступ … та же проблема.

4. Запустил приложение «от имени администратора», оно работает. Так что действительно проблема с разрешениями, как это выглядит, просто нужно выяснить, как их правильно установить.

5. У пользователей нет прав на запись в папки Program Files. Изменение разрешений — это дыра в безопасности. Ini-файлы переходят в ProgramData (для общесистемных настроек) или AppData для пользовательских настроек.

Ответ №1:

Переместил весь код из Program Files (x86) работает нормально

Комментарии:

1. На самом деле это не «исправление», даже если оно обходит проблему для вас. Здесь у вас две проблемы. Основной из них заключается в том, что вы, похоже, не знаете о последствиях UAC, который был введен в 2006 году! Второстепенным является то, что вы, похоже, не знаете о перенаправлении WOW64: вы должны смотреть Program Files , и вы должны находить это либо с помощью App.Path , либо с помощью специального запроса папки Shell32. В идеале вы должны использовать ProgramData though и находить это также с помощью вызова оболочки.

2. Вы правы, я не полностью осведомлен об этих последствиях UAC и WOW64, но мой код очень старый и очень ненадежный. На самом деле он использует переменную localdir, на которую указывает Program Files (x86) , поэтому исправление достаточно хорошо для меня. Но я изучу ваши указания. Спасибо