Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование файла / 25 сообщений из 26, страница 1 из 2
18.05.2006, 12:59
    #33735306
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Всем привет!
Вопрос такой.
Периодически в программе приходится с сервера копировать файл на локальный компьютер. Этот файл открыт несколькими пользователями.
Самый простой вариант -
select ...
copy to c:\1.dbf.
Но файл достаточно большой и это занимает некоторое время.
Команда copy file &f1 to &f2 работает быстрее, но если исходный файл открыт, то выдается сообщение, что команду нельзя выполнить.
Есть ли вариант решения задачи?
(я имею ввиду ускорение перекачки)
...
Рейтинг: 0 / 0
18.05.2006, 13:06
    #33735349
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Если файл достаточно большой, то зачем его копировать с сервера на локальную машину? Не лучше ли дать пользователям просматривать часть файла прямо с сервера?
...
Рейтинг: 0 / 0
18.05.2006, 13:08
    #33735357
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Владимир САЕсли файл достаточно большой, то зачем его копировать с сервера на локальную машину? Не лучше ли дать пользователям просматривать часть файла прямо с сервера?

Да, в общем-то, так и происходит, но просто иногда требуется эта операция.
...
Рейтинг: 0 / 0
18.05.2006, 13:34
    #33735475
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Кстати, еще один вопрос.
При входе в программу выполняется процедура открытия файлов. Причем в этой процедуре происходит и копирование этого файла (перед его открытием на моем компьютере). Более того, он уже открыт другими пользователями, но все проходит нормально.
А если после загрузки программы я пытаюсь опять его скопировать -
select ...
use
copy file &p1 to &p2
use &p1
выдается та же ошибка при копировании!
Вот этого я никак понять не могу. Ведь ситуации одинаковые - и там и там файл открыт другими пользователями, и там и там он или еще не открыт или уже закрыт!
...
Рейтинг: 0 / 0
18.05.2006, 13:42
    #33735518
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
StandD...При входе в программу выполняется процедура открытия файлов. Причем в этой процедуре происходит и копирование этого файла (перед его открытием на моем компьютере)....
Вот этого я никак понять не могу. Ведь ситуации одинаковые - и там и там файл открыт другими пользователями, и там и там он или еще не открыт или уже закрыт!Если файл открыт пользователями
Код: plaintext
USE ... SHARED
то копировать его можно, а вот если
Код: plaintext
USE ... EXCLUSIVE
то нельзя.
...
Рейтинг: 0 / 0
18.05.2006, 13:46
    #33735534
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Владимир СА StandD...При входе в программу выполняется процедура открытия файлов. Причем в этой процедуре происходит и копирование этого файла (перед его открытием на моем компьютере)....
Вот этого я никак понять не могу. Ведь ситуации одинаковые - и там и там файл открыт другими пользователями, и там и там он или еще не открыт или уже закрыт!Если файл открыт пользователями
Код: plaintext
USE ... SHARED
то копировать его можно, а вот если
Код: plaintext
USE ... EXCLUSIVE
то нельзя.

В том-то и дело, что все SHARED!!!!
...
Рейтинг: 0 / 0
18.05.2006, 13:56
    #33735575
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
StandDDВ том-то и дело, что все SHARED!!!!Стоп. Ты принял информацию с сервера в виде
Код: plaintext
SELECT .... FROM ...
Это временный курсор на твоей машине. Производим команду
Код: plaintext
COPY TO <PATH_file>
Скопировали в файл, который находится на твоей машине.
Код: plaintext
USE <PATH_file> IN  0  SHARED
Открыли файл.
Но мы его можем скопировать.
...
Рейтинг: 0 / 0
18.05.2006, 14:05
    #33735617
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
[quot Владимир СА
Стоп. Ты принял информацию с сервера в виде
Код: plaintext
SELECT .... FROM ...
Это временный курсор на твоей машине. Производим команду
Код: plaintext
COPY TO <PATH_file>
Скопировали в файл, который находится на твоей машине.
Код: plaintext
USE <PATH_file> IN  0  SHARED
Открыли файл.
Но мы его можем скопировать.[/quot]

Но мне нужно копировать не <PATH_file> IN 0 SHARED, а файл, который открыт в SELECT .... ! Как раз COPY TO <PATH_file> и не работает!
...
Рейтинг: 0 / 0
18.05.2006, 14:19
    #33735695
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
StandD[quot Владимир СА
Стоп. Ты принял информацию с сервера в виде
Код: plaintext
SELECT .... FROM ...
Это временный курсор на твоей машине. Производим команду
Код: plaintext
COPY TO <PATH_file>
Скопировали в файл, который находится на твоей машине.
Код: plaintext
USE <PATH_file> IN  0  SHARED
Открыли файл.
Но мы его можем скопировать.

Но мне нужно копировать не <PATH_file> IN 0 SHARED, а файл, который открыт в SELECT .... ! Как раз COPY TO <PATH_file> и не работает![/quot]Что-то я тебя не пойму. Только что произвел у себя
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CLOSE TABLES ALL
USE settings IN  0 
*************************************************
lc_DSN = ALLTRIM(SETTINGS.Sql_dsn)
gncn_sql = SQLSTRINGCONNECT(m.lc_DSN)  && подключился к серверу

= SQLEXEC(gncn_sql, "SELECT ind.kod_indic, ind.varmnem "+;
                    "FROM EC_INDICATORS_SPR_NEW ind "+;
                    "WHERE Tbl_source = 'WDMACRO_V_DESCNS' "+;
                    "ORDER BY 2",;
                    "Q_EC_INDICATORS_SPR")  && скачал таблицу, получив курсор

= SQLDISCONNECT(gncn_sql)	&& ******************

SELECT Q_EC_INDICATORS_SPR
COPY TO Tbl_ind  && скопировал курсор в таблицу
И получил таблицу Tbl_ind.dbf
...
Рейтинг: 0 / 0
18.05.2006, 15:11
    #33735925
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
А вот как у меня. Где здесь засада?
В select 21 - файл, расшаренный на сервере

то, что работало

SELECT 20
USE
SELECT 21
COPY TO c:\kartc.dbf
select 20
use c:\kartc.dbf

Новый вариант:

SELECT 21
use
pp1=put+"kart.dbf"
pp2="c:\kartc.dbf"
COPY FILE &pp1 TO &pp2 - вот здесь ошибка
USE &pp1
select 20
use &pp2
...
Рейтинг: 0 / 0
18.05.2006, 15:23
    #33735986
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
1. Код ошибки нужно смотреть.
2. Правильна ли получена переменная pp1
Пошагово выполнить данный блок.
...
Рейтинг: 0 / 0
18.05.2006, 15:25
    #33736012
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Кода ошибки нет.
Сообщение - "ФАЙЛ В НАСТОЯЩЕЕ ВРЕМЯ ИСПОЛЬЗУЕТСЯ"...
...
Рейтинг: 0 / 0
18.05.2006, 15:41
    #33736057
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Кажется, нащупал...
Может, чего и подскажете.

Вариант первый. Если я закрываю форму с гридом, в котором сидит локальный файл, то, при запуске из главного меню процедуры копирования do kartc, все в порядке.

Если же я нажимаю в этой форме на рисунок, в клике которого прописано:
_screen.ActiveForm.release()
do kartc
вылетает ошибка.

Что же это такое?
...
Рейтинг: 0 / 0
18.05.2006, 15:45
    #33736075
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
StandDКажется, нащупал...
Может, чего и подскажете.

Вариант первый. Если я закрываю форму с гридом, в котором сидит локальный файл, то, при запуске из главного меню процедуры копирования do kartc, все в порядке.

Если же я нажимаю в этой форме на рисунок, в клике которого прописано:
_screen.ActiveForm.release()
do kartc
вылетает ошибка.

Что же это такое?Дак форма еще не уничтожилась и ее компоненты тоже. А файл kart.dbf у тебя в форме используется EXCLUSIVE наверное. Тогда как ты можешь использовать
COPY FILE ... ???
...
Рейтинг: 0 / 0
18.05.2006, 15:46
    #33736080
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Причем это сообщение возникает на форме с "белым" пустым гридом.
...
Рейтинг: 0 / 0
18.05.2006, 15:47
    #33736085
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Да же еще не так. Файл kart.dbf еще не отключен от GRID-а.
...
Рейтинг: 0 / 0
18.05.2006, 15:49
    #33736092
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Владимир СА
Дак форма еще не уничтожилась и ее компоненты тоже. А файл kart.dbf у тебя в форме используется EXCLUSIVE наверное. Тогда как ты можешь использовать
COPY FILE ... ???

Не-не-не! В гриде сидит локальный файл, расположенный на моем компьютере и открыт не EXCL.
...
Рейтинг: 0 / 0
18.05.2006, 15:51
    #33736104
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Но зерно в этом есть!
Видимо файл (kartc) в гриде действительно не успевает вырубится, и программа ругается не на расшаренный серверный файл, а на локальный. Так как же его успеть вырубить и почему _screen.ActveForm.release его не закрывает?
...
Рейтинг: 0 / 0
18.05.2006, 15:52
    #33736109
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Если использовать твою технологию (что я лично не приветствую), то надо было создать программу в которой сначала вызывалась форма, затем выгружалась, а потом только шло копирование. Типа
Код: plaintext
1.
2.
3.
4.
5.
6.
* тело программы
.....
DO FORM ....  && в форме используешь локальную таблицу kart.dbf
....
* здесь уже нет формы и таблица отключена
do kartc
* конец тела программы
...
Рейтинг: 0 / 0
18.05.2006, 16:05
    #33736151
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Все равно не понятно :-( .

Вариант 1.

select 21 (серверный расшаренный файл &pp1)
copy to c:\kartc.dbf

Работает.


Вариант 2.

SELECT 21
use
pp2="c:\kartc.dbf"
COPY FILE &pp1 TO &pp2

Не работает.
...
Рейтинг: 0 / 0
19.05.2006, 08:08
    #33737368
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Значит так. Хочу принести извинения по поводу неправильной информации:
Если файл открыт пользователями
Код: plaintext
USE ... SHARED

то копировать его можно, а вот если
Код: plaintext
USE ... EXCLUSIVE

то нельзя.
Файл нельзя копировать командой:
Код: plaintext
COPY FILE <FileName1> TO <FileName2>
даже если он открыт с опцией SHARED в FOX-е.
Я накололся из-за того, что открыл файл с опцией SHARED, зашел в TotalCommander и скопировал его. Действительно он копируется. НО! Он копируется средствами Windows, а не FOX. Таким образом можно сказать, что файл копируется даже если он открыт с опцией SHARED, но через функции WINAPI. Если ты с ними дружишь, то вперед. А средствами FOX увы нет.
Т.е. либо оставляешь команду
Код: plaintext
COPY TO <FileName> ...
либо используешь WINAPI. Вот в качестве примера (FUNCTION FileOperation - функция взята с сайта Вячеслава Клепенина "Применение функций Windows API"). Огромное спасибо таким людям.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CLEAR
CLOSE TABLES ALL
USE Sved_pro IN  0  SHARED  && Файл открыли

tcFrom = FULLPATH("")+"DBF\Sved_pro.dbf"
?tcFrom
tcTo = FULLPATH("")
?tcTo
? FileOperation(tcFrom, tcTo,  2 )  && И его скопировали

 FUNCTION FileOperation
 LPARAMETER tcFrom, tcTo, tnOper
 *
 *  tcFrom - спецификация исходных файлов
 *  tcTo   - спецификация результирующих файлов (папки)
 *  tnOper - определяет тип операции.
 *	     tnOper= 1  - переместить файлы
 *	     tnOper= 2  - копировать файлы
 *	     tnOper= 3  - удалить файлы
 *	     tnOper= 4  - переименовать файл
 *
    LOCAL lcSHFO, lcFrom, lnLenFrom, lcTo, lnLenTo, hGlobalFrom, hGlobalTo
    LOCAL lnFlag, lnReturn
  
    DECLARE Long SHFileOperation IN Shell32.dll String @
    DECLARE Long GlobalAlloc IN WIN32API Long, Long
    DECLARE Long GlobalFree IN WIN32API Long
 * Начинаем формировать структуру в переменной lcSHFO
    lcSHFO = BINTOC(_SCREEN.HWnd, '4RS')	   && Поле hwnd
    lcSHFO = lcSHFO + BINTOC(tnOper, '4RS')	   && Поле wFunc - вид операции
 * Обработка спецификации исходных файлов
    tcFrom = tcFrom + CHR( 0 ) + CHR( 0 )		   && Дописываем нули 
    lnLenFrom = LEN(tcFrom)			   && Длина исходной строки
    hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom)   && Выделяем для неё блок памяти
    SYS( 2600 , hGlobalFrom, lnLenFrom, tcFrom)	   && и копируем туда строку
    lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS')   && Поле pFrom
 * Обработка спецификайии результирующих файлов
    IF tnOper =  3 
	lcSHFO = lcSHFO + BINTOC( 0 , '4RS')	   && для операции удаления
    ELSE
	tcTo = tcTo + CHR( 0 ) + CHR( 0 )		   && Дописываем нули 
	lnLenTo = LEN(tcTo)   && Длина результирующей строки
	hGlobalTo = GlobalAlloc(0x0040, lnLenTo)   && Выделяем для неё блок памяти
	SYS( 2600 , hGlobalFrom, lnLenFrom, tcFrom)  && и копируем туда строку
	lcSHFO = lcSHFO + BINTOC(hGlobalTo, '4RS') && Поле pTo
    ENDIF
    lnFlag =  8  +  256 
    lcSHFO = lcSHFO + BINTOC(lnFlag, '2RS')	   && Поле fFlags
    lcSHFO = lcSHFO + REPLICATE(CHR( 0 ),  12 )	   && Последние  3  поля структуры
 * Выполняем операцию
    lnReturn = SHFileOperation(@lcSHFO)
 * Чистим память
    GlobalFree(hGlobalFrom)
    IF tnOper !=  3 
	GlobalFree(hGlobalTo)
    ENDIF
 * Если lnReturn =  0 , то операция завершена успешно
    IF lnReturn !=  0 
	RETURN .f.
    ENDIF
    RETURN .t.
 ENDFUNC
И файл скопировался. Но вопрос: "А стоит ли так???". Остается за тобой.
...
Рейтинг: 0 / 0
19.05.2006, 10:27
    #33737702
StandD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
2 ВладимирСА

Большое спасибо за уделенное время. Надеюсь, кто-то еще почерпнул что-то новое для себя.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.07.2011, 12:38
    #37368714
Gena87
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Только в этом коде ошибка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 * Обработка спецификайии результирующих файлов
    IF tnOper =  3 
	lcSHFO = lcSHFO + BINTOC( 0 , '4RS')	   && для операции удаления
    ELSE
	tcTo = tcTo + CHR( 0 ) + CHR( 0 )		   && Дописываем нули 
	lnLenTo = LEN(tcTo)   && Длина результирующей строки
	hGlobalTo = GlobalAlloc(0x0040, lnLenTo)   && Выделяем для неё блок памяти
	SYS( 2600 , hGlobalFrom, lnLenFrom, tcFrom)  && вот тут если я не ошибаюсь нужно заменить на переменные hGlobalTo, lnLenTo, tcTo 
	lcSHFO = lcSHFO + BINTOC(hGlobalTo, '4RS') && Поле pTo
...
Рейтинг: 0 / 0
27.07.2011, 13:42
    #37368841
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
Какая ошибка? на какой строке?
Если у тебя не 9-й фокс то ругается на BINTOC(0, '4RS')
...
Рейтинг: 0 / 0
28.07.2011, 10:14
    #37370307
Gena87
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Копирование файла
tcFrom = tcFrom + CHR(0) + CHR(0) && Дописываем нули
lnLenFrom = LEN(tcFrom) && Длина исходной строки
hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom) && Выделяем для неё блок памяти
SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку
lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS') && Поле pFrom
* Обработка спецификайии результирующих файлов
IF tnOper = 3
lcSHFO = lcSHFO + BINTOC(0, '4RS') && для операции удаления
ELSE
tcTo = tcTo + CHR(0) + CHR(0) && Дописываем нули
lnLenTo = LEN(tcTo) && Длина результирующей строки
hGlobalTo = GlobalAlloc(0x0040, lnLenTo) && Выделяем для неё блок памяти
SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку
lcSHFO = lcSHFO + BINTOC(hGlobalTo, '4RS') && Поле pTo
ENDIF
4 и 12 строки абсолютно идентичные, а в 12 строке должен указываться путь куда копировать. Просто описка скорее всего
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование файла / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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