:: Visual Foxpro, Foxpro for DOS
Shell.Application, .CopyHere, на удаленном столе
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Вот [г*но]код извлечения содержимого из ZIP-файла (лишнее убрано) содержимого (просто небольшие файлы, не папки, сам ZIP тоже небольшой):
m.o = CREATEOBJECT("Shell.Application")
FOR EACH m.i IN m.o.NameSpace(m.z).Items && перебираем файловое содержимое ZIP-архива с именем Z...
m.o.NameSpace(m.t).CopyHere(m.i, 256) && извлекает из ZIP архива в папку T. 256 - изображать прогресс извлечения (без него вроде пробовал)
* метод асинхронный. Тут можно поставить ожидание появления раззипованного файла
ENDFOR && перебираем файловое содержимое ZIP-архива...

Все работает на локальной машине, и в локальной сети тоже (ZIP-файл лежит на файл-сервере, на локальных машинах создаются раззипованные файлы).

Но вот программа помещена на удаленный рабочий стол (2008R2, какой-то терминальный сервер), и этот код перестал извлекать файлы. Симптомы такие: все строки кода выполняются без ошибок, только извлекаемые файлы не создаются.

Вопросы:
1. На удаленных столах (терминальных серверах) это так положено?
2. Или специально запрещено администратором сервера (спросить не реально)?

Вот тут написано про метод: msdn.microsoft.com
Minimum supported client Windows 2000 Professional, Windows XP [desktop apps only]
Minimum supported server Windows 2000 Server [desktop apps only]
DLL Shell32.dll (version 4.71 or later)

3. Или версия Shell мала? (Что-то не нашел, как узнать версию Shell, к DLL-ке Shell32.dll доступа нет)
4. И еще, что за приписка в MSDN "[desktop apps only]"? Что она означает?


Доб. Вроде, связано с тем местом, куда я извлекаю - "C:\ProgramData\подпапка\файл", нехорошее место для терминального сервера. Вроде бы проблемы с доступом. (посмотреть доступ не могу, даже диск C: не виден, но он есть, и папка ProgramData там есть, это показывает FILE() и ADIR()). И файлы в туда иногда попадают! Что-то иногда происходит в удаленной системе, и она разрешает раззиповку в туда...

Да, еще оказалось, рядом с ZIP файл раззиповать можно. Пытаюсь в два этапа: раззиповать где раззиповывается, потом скопировать раззипованное в этот "C:\ProgramData\подпапка\файл".

Воспользовался GETENV("ProgramData") = C:\ProgramData (перебирал список "AppData; ALLUSERSPROFILE, ProgramData"), подумал, что это место, которое после установки проги, будет доступно всем юзерам компа, запустившим эту прогу. Может это все не для этого )

Вобщем что-то с доступами... не копируется в эту папку файл, но ошибок не выдает. Впечатление такое, что эти скопированные файл завтра, например, там станут видны Где то я наталкивался, что если расшаренную папку на сервере удалить, а потом создать новую с таким же именем, то ее параметры, как "шары", неявно реанимироютя. Хотя в данном случае не "шара", но и не типичная папка, и подпапку я удаляю, и создаю заново через CreateDirectory, с специальным доступом "всем" на SDDL, все проверено на локалках. Фигня какая-то, вобщем...

(И папка, оказываается, не удаляется, которую я типа подменяю на с нужными правами. Все не так без доступа. Эдак можно каждую команду фокса, и апи, сопровождать проверкой, выполнилась-ли? программа будет длиннее раза в 3)

Убрал из источника ZIP-файл, но оставил раззипованный (программа устроена, то если есть ZIP-файл, то она его раззиповывает на локальную машину, а если есть уже раззипованный, то копирует его на локальную машину. Машина вся - на удаленном рабочем столе, напоминаю. Так эта с.ка) удаленная машина копирует прекрасно в ProgramData, а раззиповывать - фик. Потратил пол выходного (и ранее не знаю сколько на этот г*но-код ((c) ИК) !Попробую без атрибутов выкопировывать из ZIP-файла, может там атрибуты! Я же прогой его раззиповывал, но копировка раззипованного не удавалась! А Нортоном раззиповал, то эти файлы копируются прогой!)

Вобщем зря отвлек. И сам не справился (пока). Читателям спс

Вышеуказанная раззиповка работает на удаленном столе вот таким образом:
- атрибуты файлов и доступы папок не причем (если они правильные)
- ZIP-файл и папка для раззиповки должны находиться на одном логическом диске (если не диск, а ресурс, то не проверял)
- в папке C:\ProgramData\подпапка вобще раззиповка не происходит, даже если ZIP-файл туда скопировать
- делаю временную папку в SYS(2023), копирую туда ZIP-файл, раззиповываю в ней, результат копирую в C:\ProgramData\подпапка, временную папку уничтожаю
- сделал 2 прохода, на первом проходе раззиповывает как в примере (в локальной сети все работает), если не получилось, то на 2м проходе все эти копирования/удаления временных файлов
(рожден очередной г*нокод на 50 строк вместо 5)



Исправлено 9 раз(а). Последнее : of63, 07.08.16 11:55
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
ry

Сообщений: 2113
Дата регистрации: 24.09.2007
Если кратко, то не стоит пытаться писать что-либо в %programfiles%, %programdata%, %systemdrive%, %systemroot% и т.п., так как эти папки на современных системах имеют особый статус, и запись в них мало того что контролируется системой и UAC, так еще и может виртуализироваться (естественно, без уведомления пользователя). То есть записываемые туда пользователем файлы реально оказываются где-то в подпапках C:\Users\User_name\AppData\Local\VirtualStore\. Встречал как-то совет, что если их при первом создании оттуда удалить, то в последующем создание этих же фалов происходит уже именно в той системной папке, куда их пытаются записать (не уверен, что это действительно так, поэтому не проверял, да и надобности не было). Кстати, для терминальных сессий админы могут (и должны) настраивать дополнительные условия, ограничивающие действия пользователей.
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Кстати, запись копированием в эти папки происходит. Не работает раззиповка туда. Эта раззиповка не работает вообще практически на виртуальном диске C: в терминальной сессии. Странно, копирование туда возможно, а раззиповка нет...

Если что, то я пытаюсь хранить в этом ProgramData, например, БД КЛАДР. Чтобы несколько разных программ (одного программного комплекта) обращались к одной копии КЛАДР. Причем, есть желание, чтобы папка с КЛАДР лежала на локальном диске каждой машины. Хотелось бы, чтобы эта логика адекватно работала и под терминальным сервером. Вот и подумал, почему бы не положить эту единственную копию в GETENV("ProgramData"), вроде бы эта папка для подобного. Конечно, можно условиться на такой папке и в обычном месте...

да нормально все вышло, с этой папкой ProgramData, только пришлось раззиповывать в промежуточной папке. Терминальная сессия - странная штука какая-то: предлагает диск C: (содержит папку WINDOWS почти пустую), SYS(2023) ссылается туда, т.е. фокс ей пользуется и работает, хотя C: - явно "виртуальный" диск небольшого размера. Раззиповка не работает на C: ни в какой подпапке, в т.ч. и в SYS(2023). Также есть диск H: - туда ссылает GETENV("HOMEDRIVE"). Там тоже есть папка WINDOWS, также там лежат мои нестираемые от сессии к сессии личные папки, и мой тамошний рабочий стол и документы. На H: раззиповка работает. Непонятно, зачем два диска C: и H:, может просто для любителей писать программы с жестким заданием диска "C:" )

Еще деталь с этими виртуальными дисками C: и H: Например, удаляю временную папку на H, предварительно удалив из нее временные папки. Не удаляется, пишет, что папка не пуста. Ставлю удаление в цикл на 5 сек, (с паузой 0.2 сек, чтобы не напрягать ОС). Удаляется иногда. Увеличил время ожидания удаления до 15 сек - стало стабильно удаляться. Т.е. запросы фокса типа FILE() и DIRECTORY() имеют запоздалый отклик от ОС... Но стала понятнее ситуация, когда "вроде не скопировалось, но подождешь немного и файлы появляются" )

Доб. Помучался с полмесяца с этим CopyHere и выбросил. Метод то работает, то не работает, ничего не сообщает, в TRY не вываливается...
Заменил на VFPcompression.dll и стало все штатно работать, во всех системных папках, без всяких задержек и проверок.



Исправлено 3 раз(а). Последнее : of63, 26.08.16 08:10
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
Добавлю к of63 изысканиям на терминале

o=CREATEOBJECT("shell.application")
FOR EACH ofile IN o.NameSpace(cSource).items
?ofile.Name
ENDFOR

на локальном компе ofile.Name возвращает полное имя (с расширением), на терминале только имя без расширения.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
alextash

Сообщений: 2281
Откуда: НСК
Дата регистрации: 03.05.2006
Скорее всего не стоит настройка папки в терминале - отображать расширение
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
PaulWist
Автор

Сообщений: 14601
Дата регистрации: 01.04.2004
alextash
Скорее всего не стоит настройка папки в терминале - отображать расширение

Я сначала про это подумал, проверил - не фига oFile.Name возвращает только имя, JustExt(oFile.Name), просто вывод в переменную, расширения не возвращают, НО при записи на диск объект oFile пишется с расширением.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 08.05.20 09:27
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
Сейчас часа два с этим сидел и плюнул
Все по описанному вами рецепту работает,
только толку ноль
dbf, куда все импортирую, заткнулся на 29 с чем то миллионах
записей по объему. виндовое ограничение на размер файла сработало
Можно, конечно, кинуть на Оракл или MS SQL или Постгресс
Все тут дома есть, да толку что. Хотели потом эти данные
обрабатывать своими наработанными на Фортране программами.
Весь этот хлам я загрузил конвейерами с интернет.
Хозяева явно держали исходное состояние
данных на настоящих Юниксовыйх
серверах баз данных, а выложили для интернет
во множестве zip не спроста, именно из-за суммарного объема.
В будущем году обещают дать доступ к суперкомпьютеру.
Бог даст, может и доживем.
Все спасибо за рецепты
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
файлы типа gz так не кушает
дает ole ошибку
Ratings: 0 negative/0 positive
Re: Shell.Application, .CopyHere, на удаленном столе
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
С БК как-то разбирали файлы .gz, в формате HTTP-запросов... что-то у нас такое было )

аа! у нее была утилита, выполняемая в командной строке (в черном окне), и она зиповала и раззиповала.

С штатной механикой винды (с ZIP) я завязал, она какая-то нерабочая, может, они специально сделали ее нерабочей из API, т.к. она какая-то недолицензированная (нельзя создать новый файл, как Пива и говорил, предлагая некий хак)



Исправлено 3 раз(а). Последнее : of63, 06.11.21 19:16
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика