powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
9 сообщений из 9, страница 1 из 1
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37239580
Koryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем ^^

Обычно сообщения такого типа начинаются (и продолжаются) стандартно, так что не будем нарушать традицию ^__^

Итак. Есть приложение на фоксе 8.0. работает с локальными таблицами. Понадобилось срочно переделать его так, чтобы в нем могли работать сразу несколько пользователей (5 максимум, но скорее всего, не более 3-х будет) по сети.
Стандартно - опыта разработки многопользовательских приложений не имею :"-)

Как сделали: приложение запускается либо локально на компьютере, где установлено, либо по сети - просто запускаем экзешник из расшаренной папки с приложением. Организована блокировка записей при попытке доступа к ним нескольких пользователей, отслеживание количества пользователей, работающих с приложением. Заблокирован повторный запуск приложения на одном и том же компьютере. Все нормально, работает более-менее стабильно.
А вот теперь западла. Программа использует в качестве справочника (если можно так сказать) таблицу из 3+ миллионов записей (паспортные данные). Select из нее не делается, только поиск Seek, видна она пользователю только на форме поиска в гриде, но открыта висит постоянно (это было прописано изначально). Дабы не напрягать сеть переброской почти гига инфы, мне пришла в голову "гениальная" идея - поместить экземпляр этой таблицы на локальный компьютер (собственно, она там уже есть). Локальный путь к этой таблице хранится в ini-файле, на каждом компе разный. Перед открытием я пытаюсь определить, там ли эта таблица, или нет. Использую функцию FILE(). При запуске на локальном компьютере строка типа FILE("C:\ins\ins.dbf") отрабатывает нормально, а вот при запуске из сети выдает False, хотя следующий за ним USE отрабатывает нормально - открывает именно локальный экземпляр таблицы.
Каким образом можно все-таки проверить, лежит ли таблица именно в той локальной папке, которая указана в ini-файле?
Переписывать заново все приложение уже нет времени ((((.

В нагрузку вопрос - насколько "напрягается" сеть, если индексы для этой 3-х миллионной таблицы берутся тоже из расшаренной папки? Или лучше тоже положить их в локальную папку?

------------------------------------------------------
Истинный оргазм можно испытать только после нескольких часов жесткой е*ли с кодом
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37239810
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для программы без разницы где лежит файл. Программа обращается к ОС за нужным файлом, остальное задачи ОС.
Скорее всего что-то криво написал. Покажи кусок кода который неправильно работает.

Если используется только SEEK то целиком таблица не читается клиентом, читается только нужный индекс (не весь CDX) и читается только найденная запись.
Если эта таблица обновляется редко, то можешь хранить ее локально и обновлять периодически. Так читать из нее однозначно быстрее. Проблемы только с ее обновлением.

Индексы надо хранить там же где и DBF. тут без вариантов.
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240065
Koryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
** ins - переменная пути. На моем компе она, например, C:\INS, на компе коллеги C:\TAL
** считывается из Ini- файла
do while !file(ALLTRIM(ins)+'\ins.dbf') 
** Запускается форма, в которой можно указать, где находится эта таблица. 
** На форме переопределяется переменная ins и путь записывается  в Ini-файл
	do form path_ins.scx  
enddo
т.е. если файл Ins.dbf не найден по тому пути, который указан в настроечном файле, то перенастраиваем путь, и так до тех пор, пока не будет указан верный путь.
При запуске с локального диска все отрабатывает нормально. При запуске с другого компа по сети отрабатывает бесконечно (то бишь file() каждый раз возвращает .f. )

команда
Код: plaintext
USE "&ins\ins.dbf" in  0  SHAR index sns.Idx, SPOLIS.IDX
отрабатывает нормально, при условии, кончено, что ins.dbf находится именно там, где указано. Т.е. здесь действительно без разницы, где лежит файл.
Если я буду индекс к этой таблице хранить там же, где и саму таблицу, то опять же надо его найти, как и саму таблицу.
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240123
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Koryuu** ins - переменная пути. На моем компе она, например, C:\INS, на компе коллеги C:\TAL
** считывается из Ini- файла
А ini-файл откуда считывается?

Для целей проверки, не пробовали вывести то значение, которое было считано из ini-файл? Ну, например, при открытии формы path_ins.scx отобразить в качестве значения по умолчанию тот путь, который был считан из ini-файла
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240243
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай вывод переменной Ins во всех местах и посмотри что реально в ней:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
MessageBox(ins)
do while !file(ALLTRIM(ins)+'\ins.dbf') 
...
enddo
MessageBox(ins)
...
MessageBox(ins)
USE (ALLTRIM(ins)+'\ins.dbf') in  0  SHAR index sns.Idx, SPOLIS.IDX
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо alltrim() лучше ADDBS() использовать для путей
Код: plaintext
do while !file(addbs(ins)+'ins.dbf') 
и имя переменной неплохо было бы дать вменяемое, например gcInsPath
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240401
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще проверь как из Ini читаешь, если с помощью GetPrivateProfileString то так попробуй
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE INTEGER GetPrivateProfileString IN Win32API AS GetPrivateProfileString;
	String cSection,String cKey,String cDefault,String @cBuffer,;
	Integer nBufferSize, String cINIFile

...
func ReadIni
lpara tcKey, tcSection, tcIniFile
local lcVal, lnLen
if empty(tcSection)
	tcSection = 'Common'
endif
lcVal = space( 2000 )
lnLen = GetPrivateProfileString(tcSection, tcKey, '', @lcVal,  2000 , fullpath(tcIniFile))
lcVal = left(lcVal, lnLen)
return lcVal
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240594
Koryuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле все оказалось совсем просто (и глупо, если честно)
Параллельно была открыта таблица, в которой было поле ins - старая настройка путей, использовавшаяся при локальной работе приложения. При проверке функцией file() ins брался из поля, а при USE - из переменной.

Блин, мне таа-аак стыдно
Могла бы и сама додуматься до вывода значений (

Спасибо за советы. С наступающим всех =^_^=
...
Рейтинг: 0 / 0
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
    #37240655
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про "венгерскую нотацию", это правила именования переменных, полей, объектов.
Если их жестко придерживаться, то подобных проблем не будет.
Вкратце смысл такой: префикс переменной означает область видимости и тип. Например gcIns
g - глобальный
с - символьный
в именах полей и свойств только тип, например MyTable.cIns

Тогда подобных проблем не возникнет и код читать проще, не надо помнить где чего какого типа.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]