Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки? / 9 сообщений из 9, страница 1 из 1
29.04.2011, 10:39
    #37239580
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
Добрый день всем ^^

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

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

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

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

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

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

Индексы надо хранить там же где и DBF. тут без вариантов.
...
Рейтинг: 0 / 0
29.04.2011, 13:43
    #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
29.04.2011, 14:03
    #37240123
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
Koryuu** ins - переменная пути. На моем компе она, например, C:\INS, на компе коллеги C:\TAL
** считывается из Ini- файла
А ini-файл откуда считывается?

Для целей проверки, не пробовали вывести то значение, которое было считано из ini-файл? Ну, например, при открытии формы path_ins.scx отобразить в качестве значения по умолчанию тот путь, который был считан из ini-файла
...
Рейтинг: 0 / 0
29.04.2011, 14:46
    #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
29.04.2011, 15:19
    #37240310
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
вместо alltrim() лучше ADDBS() использовать для путей
Код: plaintext
do while !file(addbs(ins)+'ins.dbf') 
и имя переменной неплохо было бы дать вменяемое, например gcInsPath
...
Рейтинг: 0 / 0
29.04.2011, 15:41
    #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
29.04.2011, 16:45
    #37240594
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить наличие файла на локальном диске, если приложение запущено из сетевой папки?
На самом деле все оказалось совсем просто (и глупо, если честно)
Параллельно была открыта таблица, в которой было поле ins - старая настройка путей, использовавшаяся при локальной работе приложения. При проверке функцией file() ins брался из поля, а при USE - из переменной.

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

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

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


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