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

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

В том-то и дело, что все SHARED!!!!
...
Рейтинг: 0 / 0
Копирование файла
    #33735575
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StandDDВ том-то и дело, что все SHARED!!!!Стоп. Ты принял информацию с сервера в виде
Код: plaintext
SELECT .... FROM ...
Это временный курсор на твоей машине. Производим команду
Код: plaintext
COPY TO <PATH_file>
Скопировали в файл, который находится на твоей машине.
Код: plaintext
USE <PATH_file> IN  0  SHARED
Открыли файл.
Но мы его можем скопировать.
...
Рейтинг: 0 / 0
Копирование файла
    #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
Копирование файла
    #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
Копирование файла
    #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
Копирование файла
    #33735986
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Код ошибки нужно смотреть.
2. Правильна ли получена переменная pp1
Пошагово выполнить данный блок.
...
Рейтинг: 0 / 0
Копирование файла
    #33736012
StandD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кода ошибки нет.
Сообщение - "ФАЙЛ В НАСТОЯЩЕЕ ВРЕМЯ ИСПОЛЬЗУЕТСЯ"...
...
Рейтинг: 0 / 0
Копирование файла
    #33736057
StandD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется, нащупал...
Может, чего и подскажете.

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

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

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

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

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

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

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

Большое спасибо за уделенное время. Надеюсь, кто-то еще почерпнул что-то новое для себя.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Копирование файла
    #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
Копирование файла
    #37368841
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая ошибка? на какой строке?
Если у тебя не 9-й фокс то ругается на BINTOC(0, '4RS')
...
Рейтинг: 0 / 0
Копирование файла
    #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
25 сообщений из 26, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Копирование файла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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