Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2018, 11:13   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Syns1992 Посмотреть сообщение
Хотя нет , замечаю опять в папке уже txt на пол гига
в моём коде стоит проверка и если файл TXT с таким же именем уже есть в папке, куда копируется, то ему даётся новое имя (перед именем добавляется нарастающее число).
Это если используется тот код, что я дал.

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

Иначе - отладчик Вам в руки!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2018, 11:25   #12
Syns1992
Пользователь
 
Регистрация: 26.07.2018
Сообщений: 16
По умолчанию

Спасибо за ответы, с копированием разобрался , все прекрасно работает.
Теперь есть проблемка.
Мне нужно запустить jar файл , средствами делфи не получилось .

Создал bat файл , который из директории в которой разположен jar , запускает его.
В виндовсе он работает, вот код:

Код:
java -jar LongLatPicker.jar
Jar запускается и выполняет свои действия.
Теперь нужно открыть bat файл в делфи , пробовал 2 функции , они работают, но jar не запускается .
Вот первая :

Цитата:
function FileExec( const CmdLine: String; bHide, bWait: Boolean): Boolean;
var
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
with StartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
if bHide then
wShowWindow := SW_HIDE
else
wShowWindow := SW_SHOWNORMAL;
end;

Result := CreateProcess(nil, PChar(CmdLine), nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
if Result then
CloseHandle(ProcessInfo.hThread);

if bWait then
if Result then
begin
WaitForInputIdle(ProcessInfo.hProce ss, INFINITE);
WaitForSingleObject(ProcessInfo.hPr ocess, INFINITE);
end;
if Result then
CloseHandle(ProcessInfo.hProcess);
end;

Цитата:
procedure TForm1.btn1Click(Sender: TObject);
begin
FileExec('C:\0brabotka\Ships\LatLon gPicker\storm.bat',False,True);
end;

написал в бат файле PAUSE (задержка) - и там была ошибка
Цитата:
C:\Users\User\Desktop\x>java -jar LongLatPicker.jar
Error: Unable to access jarfile LongLatPicker.jar
Тоесть файл всетаки запустился (батник) , но вот привычно не открыл jar

Также аналогично и с этой функцией, та же самая ошибка в командной строке :

Цитата:
ShellExecute(handle,'c:\autoexec.ba t',nil,nil,nil,SW_SHOW);
Подозреваю может что-то с правами администратора , или может ктото подскажет как открыть именно JAR ? , или может какой ни буть другой скрипт создать , чтоб потом запустить его в Делфи .
Syns1992 вне форума Ответить с цитированием
Старый 02.08.2018, 11:58   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте перед запуском jar файла сделать директорию с этим самым jar файлом текущей:


Код:
procedure TForm1.btn1Click(Sender: TObject);
begin
  SetCurrentDir('C:\0brabotka\Ships\LatLongPicker');
  FileExec('C:\0brabotka\Ships\LatLongPicker\storm.bat',False,True);
end;
или

Код:
procedure TForm1.btn1Click(Sender: TObject);
begin
  ChDir('C:\0brabotka\Ships\LatLongPicker');
  FileExec('C:\0brabotka\Ships\LatLongPicker\storm.bat',False,True);
end;

Последний раз редактировалось Serge_Bliznykov; 02.08.2018 в 12:02.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2018, 12:00   #14
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ага, с правами админа. Запускаем бат - бат для открытия jar ищет джаву (скорее всего через переменную среды JAVA_HOME) - находит в программ файлз и пытается запустить жабу.

Но поскольку сам батник (кстати, под виндой лучше юзать cmd) запущен не из под админа - то и доступа на запуск java из системной папки PF может не быть

Хотя вот из этого
Цитата:
Error: Unable to access jarfile LongLatPicker.jar
Скорее всего, Сергей прав, нужно прописывать полный путь до жара
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 02.08.2018 в 12:02.
Sciv вне форума Ответить с цитированием
Старый 02.08.2018, 12:43   #15
z-wer
Пользователь
 
Регистрация: 03.03.2010
Сообщений: 89
По умолчанию

Может исходную директорию неправильно прописал, оно и будет тебе копировать файлы со всего диска с расширением .тхт
z-wer вне форума Ответить с цитированием
Старый 02.08.2018, 12:47   #16
Syns1992
Пользователь
 
Регистрация: 26.07.2018
Сообщений: 16
По умолчанию

Спасибо помогло , но при отдельной программе и отдельной компиляции.
Но как только я добавляю в свою основную программу , выбивает ошибку.
Помогите в последний раз .

Вот весь код , пустая форма и одна кнопка :

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileCtrl, StdCtrls, ShlObj, Buttons, ShellAPI, Masks, ExtCtrls;

type
  TForm1 = class(TForm)
    pnl1: TPanel;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CopyDir(fromDir, toDir: string): boolean;
var
fos: TSHFileOpStruct;
todir2: string;
begin
todir2:=todir;
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
//fFlags := FOF_FILESONLY;
fFlags:= FOF_SIMPLEPROGRESS;
fflags:= fflags or FOF_NOCONFIRMATION;
fflags:= fflags or FOF_SILENT;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir2);
end;
Result := (0 = ShFileOperation(fos));
end;

const
  SELDIRHELP = 1000;


var curFileCount : integer;

procedure DirSearchAndCopy(Dir: string; Mask : string; DirDest : string);
var
  SearchRec: TSearchRec;
  destFileName : string; 
begin
  Dir := IncludeTrailingBackslash(Dir);

  if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
    repeat
      Application.ProcessMessages;

      if (SearchRec.Attr and faDirectory) <> 0 then begin
         // рекурсия 
         if (SearchRec.name <> '.') and (SearchRec.name <> '..') then
                   DirSearchAndCopy(Dir + SearchRec.name, Mask, DirDest )

      end
      else begin
        if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then begin
          destFileName := DirDest + '\' + SearchRec.Name;
          while FileExists( destFileName ) do begin
             Inc(curFileCount);
             destFileName := DirDest + '\' + IntToStr(curFileCount) + SearchRec.Name
          end; 
          CopyFile( PChar(Dir + SearchRec.Name), PChar( destFileName ), false);
        end;
      end;
    until FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;





procedure TForm1.btn1Click(Sender: TObject);
var
  chosenDirectory : string;
begin

  if SelectDirectory('Выберете папку с кораблями!', '\\192.168.0.140\Na_obrabotku\14_Sentinel-1\2018', chosenDirectory)
  then ShowMessage('Обработка началась')
  else ShowMessage('Ошибка выбора папки');
  CopyDir(PChar (chosenDirectory), PChar ('C:\0_TEMP7'));
  curFileCount := 1;
  DirSearchAndCopy(chosenDirectory,'*.txt', 'C:\0brabotka\Ships\LatLongPicker\in')
  ChDir('C:\0brabotka\Ships\LatLongPicker');
  ShellExecute(0, nil,'C:\0brabotka\Ships\LatLongPicker\storm.bat',nil,nil,1);

end;

end.
Вот если с кнопки убрать две последние строки :
- там где устанавливаем текущую папку
- запускаем Бат ,

то программа выполняется замечательно .

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 02.08.2018 в 13:33.
Syns1992 вне форума Ответить с цитированием
Старый 02.08.2018, 12:50   #17
Syns1992
Пользователь
 
Регистрация: 26.07.2018
Сообщений: 16
По умолчанию

Нет ошибка возникает тогда , когда я не выбираю папку . Тоесть выполнение программы по расписанию , обязательно должно иметь главную причину : Выбранную папку , а вот когда я нажимаю отмену , у меня код продолжает обрабатываться , и так копирует все txt c всего ПК.

Вот в начале при выборе папки , нужно как то дописать , что когда я не выбираю папку , то программа сразу закрывается .
Syns1992 вне форума Ответить с цитированием
Старый 02.08.2018, 12:53   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут права админа? Просто надо узнать об относительных/абсолютных путях и либо указать/изменить нужную текущую директорию, либо писать полные пути.

Цитата:
Сообщение от Sciv Посмотреть сообщение
батник (кстати, под виндой лучше юзать cmd)
А где тогда лучше батник? Под линуксом что ли?
И чем лучше?
Цитата:
Сообщение от Sciv Посмотреть сообщение
доступа на запуск java из системной папки PF может не быть
Не может, по крайней мере в стандартной конфигурации (без каких-нибудь изменений групповой политики для запрета всего подряд и т.п.)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.08.2018, 13:36   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Syns1992 Посмотреть сообщение
Вот в начале при выборе папки , нужно как то дописать , что когда я не выбираю папку , то программа сразу закрывается .
Код:

procedure TForm1.btn1Click(Sender: TObject);
var
  chosenDirectory : string;
begin

  if SelectDirectory('Выберете папку с кораблями!', '\\192.168.0.140\Na_obrabotku\14_Sentinel-1\2018', chosenDirectory)
  then begin
      ShowMessage('Обработка началась');
      CopyDir(PChar (chosenDirectory), PChar ('C:\0_TEMP7'));
      curFileCount := 1;
      DirSearchAndCopy(chosenDirectory,'*.txt', 'C:\0brabotka\Ships\LatLongPicker\in')
      ChDir('C:\0brabotka\Ships\LatLongPicker');
      ShellExecute(0, nil,'C:\0brabotka\Ships\LatLongPicker\storm.bat',nil,nil,1);
  end
  else ShowMessage('Ошибка выбора папки');

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2018, 15:17   #20
Syns1992
Пользователь
 
Регистрация: 26.07.2018
Сообщений: 16
По умолчанию

Ошибка компиляции к сожалению не пропала (
Вот не пойму , убираю из тела кнопки 2 последние строчки , то компилируется , а так нет.
Снимок Ошибок , после компиляцией , перед компиляцией я очистил журнал.
Снимок.JPG
Вот еще раз полностью код:

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FileCtrl, StdCtrls, ShlObj, Buttons, ShellAPI, Masks, ExtCtrls;

type
  TForm1 = class(TForm)
    pnl1: TPanel;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CopyDir(fromDir, toDir: string): boolean;
var
fos: TSHFileOpStruct;
todir2: string;
begin
todir2:=todir;
ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_COPY;
//fFlags := FOF_FILESONLY;
fFlags:= FOF_SIMPLEPROGRESS;
fflags:= fflags or FOF_NOCONFIRMATION;
fflags:= fflags or FOF_SILENT;
pFrom := PChar(fromDir + #0);
pTo := PChar(toDir2);
end;
Result := (0 = ShFileOperation(fos));
end;

const
  SELDIRHELP = 1000;


var curFileCount : integer;

procedure DirSearchAndCopy(Dir: string; Mask : string; DirDest : string);
var
  SearchRec: TSearchRec;
  destFileName : string; 
begin
  Dir := IncludeTrailingBackslash(Dir);

  if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
    repeat
      Application.ProcessMessages;

      if (SearchRec.Attr and faDirectory) <> 0 then begin
         // рекурсия 
         if (SearchRec.name <> '.') and (SearchRec.name <> '..') then
                   DirSearchAndCopy(Dir + SearchRec.name, Mask, DirDest )

      end
      else begin
        if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then begin
          destFileName := DirDest + '\' + SearchRec.Name;
          while FileExists( destFileName ) do begin
             Inc(curFileCount);
             destFileName := DirDest + '\' + IntToStr(curFileCount) + SearchRec.Name
          end; 
          CopyFile( PChar(Dir + SearchRec.Name), PChar( destFileName ), false);
        end;
      end;
    until FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;





procedure TForm1.btn1Click(Sender: TObject);
var
  chosenDirectory : string;
begin

  if SelectDirectory('Выберете папку с кораблями!', '\\192.168.0.140\Na_obrabotku\14_Sentinel-1\2018', chosenDirectory)
  then begin
  ShowMessage('Обработка началась')
  CopyDir(PChar (chosenDirectory), PChar ('C:\0_TEMP7'));
  curFileCount := 1;
  DirSearchAndCopy(chosenDirectory,'*.txt', 'C:\0brabotka\Ships\LatLongPicker\in')
  ChDir('C:\0brabotka\Ships\LatLongPicker');
  ShellExecute(0, nil,'C:\0brabotka\Ships\LatLongPicker\storm.bat',nil,nil,1);
  end
  else  ShowMessage('Ошибка выбора папки);

end;

end.

Последний раз редактировалось Syns1992; 02.08.2018 в 15:19.
Syns1992 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование групы файлов из одной папки в другую Progsenya C# (си шарп) 1 30.04.2011 11:56
Переход из одной папки в другую sanya_oz PHP 3 03.01.2011 23:54
Перенос файла из одной папки в другую Amelie_L Microsoft Office Excel 6 29.01.2010 16:28
макрос для копирования строк из одной таблицы в другую IRI_NA Microsoft Office Excel 9 25.01.2010 20:55
Копирования строк из одной таблици в другую Andersen Microsoft Office Access 6 13.08.2008 10:46