Проблема с файлом Windows 7 - PullRequest
0 голосов
/ 28 ноября 2009

Я использую VB6 SP6 Этот код работает правильно в течение многих лет, но сейчас у меня проблема с сетью от WIN7 до WIN7. Он также корректно работает в сети XP на Win7.

Open file for random as ChannelNum LEN =90
 'the file is on the other computer on the network

RecNum = (LOF(ChannelNum) \ 90) + 2

Put ChannelNum, RecNum, MyAcFile 
'(MyAcFile is UDT that is less than 90 long)

.......... other code that does not reference file or RecNum - then

RecNum = (LOF(ChannelNum) \ 90) + 2
Put ChannelNum, RecNum, MyAcFile
Close ChannelNum

Вторая запись перезаписывает первую.

В прошлом у нас была похожая проблема с OpportunisticLocking, поэтому мы отключаем ее при установке вместе с некоторыми другими ключами, которые вызывают ошибки в данных в сетях Windows.

Однако у нас не было подобных проблем в течение многих лет, поэтому я думаю, что у MS есть какой-то новый «лучший» вариант, который, по их мнению, «улучшит» сетевое взаимодействие.

Спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 28 ноября 2009

Я сомневаюсь, что здесь есть какая-то "ошибка", кроме вашего подхода. Метаданные файла, которые запрашивает LOF (), не предназначены для немедленного обновления простыми записями. Задержка кажется глупой идеей, склонной к случайным сбоям, если только не используется очень длительная задержка и не снижается производительность в лучшем случае. Даже закрытие / повторное открытие может быть сомнительным: оператор Close в VB6 является асинхронной операцией. Вот почему существует оператор Reset .

По этой же причине на уровне API существуют такие вещи, как FlushFileBuffers () и SetEndOfFile () . Они также являются относительно дорогостоящими операциями с точки зрения производительности.

Отслеживайте свои записи самостоятельно. При необходимости используйте LOF () только после первого открытия файла.

0 голосов
/ 28 ноября 2009

Это может быть просто проблема времени. В некоторых случаях ваша функция LOF () возвращает больше обновленной информации, чем в других запусках. API файловой системы является асинхронным, например, когда вызывается некоторая функция записи, она не будет немедленно отражена как увеличенный размер.

Вкратце: в вашем коде показана старая ошибка, которую просто воспроизвести в Windows 7.

Исправить ошибку самым дешевым способом: вы можете решить добавить задержку (это может быть значительная задержка, скажем, 5 секунд).

Более сложное исправление - принудительное обновление размера путем закрытия и повторного открытия файла.

0 голосов
/ 28 ноября 2009

Хммм ... это файл (в соответствии с оператором open в верхней части примера кода) UNC имя файла или аналогично x: \ где x это подключенный диск? Вы не увеличиваете RecNum? Судя по коду, RecNum не изменяется и, следовательно, как представляется, перезаписывает первую запись ... Извините за звучание ммм, каламбур не предназначен ... базовый ... Было бы полезно показать еще немного кода здесь ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...