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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2010, 13:42   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос WinInet скичивает только первые 322 байта, почему?

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

но почему программа скачивает только первые 322?

вот модуль:
Код:
{-------------------------------------------------------------------------------
  Функция: ThttpThread.CheckFiles
  Автор:    ArhangeL
  Дата:  2010.07.31
  Входные параметры: Нет
  Результат:    Boolean
  Описание:  Функция проверки файлов.
  Грузит файл , потом парсит его.. если файл в папке с программой отличается
   от файла в списке, то имя этого файла поподает в другой список.
  Другой список идёт уже на обработку загрузки=)
-------------------------------------------------------------------------------}
function ThttpThread.CheckFiles: Boolean;
var
  i: Integer;
  sFileName, sFileCRC, sFileMD5: array of string;
  List: TStringList;
  FilesList: string;
begin
  Result := False;
  myDir := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)));
  FilesURL := AdminForm.HTTPFilesEdit.Text;
  FilesList := AdminForm.FilesListNameEdit.Text;
  FilesToGet := TStringList.Create;
  List := TStringList.Create;
  if FileExists(myDir + FilesList) then
  begin
    Translator_MessageToLog('Файл-лист загружен, начинаю проверку файлов....', 'Files-list downloaded! Checking files...', MainForm.log);
    try
      List.LoadFromFile(myDir + FilesList);
    except
      Translator_MessageToLog('[Ошибка] Ошибка чтения списка файлов...', '[Error] Can not read files-list...', MainForm.Log);
      SendMessage(MainForm.handle, PROGRESS, 2, 0);
      MainForm.SCurrFileDesc.Caption := Translator('Текущий файл: ', 'Current file: ');
      MainForm.StatusBar.Panels[1].Text := Translator('Проверка файлов неудачна!', 'Checking files Failed!');
      FilesToGet.Free;
      List.Free;
      Result := False;
    end;

    MainForm.StatusBar.Panels[1].Text := Translator('Проверка файлов', 'Checking files');
    SendMessage(MainForm.Handle, PROGRESS_MAX, 2, List.Count);
    MainForm.FullCountDesc.Caption := Translator('Всего файлов: ' + IntToStr(List.Count), 'Total files: ' + IntToStr(List.Count));

    SetLength(sFileName, List.Count);
    SetLength(sFileMD5, List.Count);
    SetLength(sFileCRC, List.Count);

    for i := 0 to List.count - 1 do
    begin
      SendMessage(MainForm.Handle, PROGRESS, 2, i);
      sFileName[i] := Copy(List.Strings[i], 1, Pos(':', List.Strings[i]) - 1);
      case AdminForm.FilesHashGr.ItemIndex of
        0: sFileMD5[i] := Copy(List.Strings[i], Pos(':', List.Strings[i]) + 1, Length(List.Strings[i]));
        1: sFileCRC[i] := Copy(List.Strings[i], Pos(':', List.Strings[i]) + 1, Length(List.Strings[i]));
      end;
      MainForm.SCurrFileDesc.Caption := Translator('Текущий файл: ' + sFileName[i], 'Current file: ' + sFileName[i]);
    end;

    for i := 0 to Length(sFileName) - 1 do
    begin
      if (not FileExists(myDir + sFileName[i])) then
      begin
        case AdminForm.FilesHashGr.ItemIndex of
          0: FilesToGet.Add(sFileName[i]);
          1: FilesToGet.Add(sFileName[i]);
        end;
      end
      else
      begin
        case AdminForm.FilesHashGr.ItemIndex of
          0:
            begin
              if (MD5DigestToStr(MD5File(myDir + sFileName[i])) <> sFileMD5[i]) then
              begin
                FilesToGet.Add(sFileName[i]);
              end;
            end;

          1:
            begin
              if (FileCRC(myDir + sFileName[i]) <> sFileCRC[i]) then
              begin
                FilesToGet.Add(sFileName[i]);
              end;
            end;
        end;
      end;
    end;
    SendMessage(MainForm.handle, PROGRESS, 2, 0);
    MainForm.SCurrFileDesc.Caption := Translator('Текущий файл: ', 'Current file: ');
    Translator_MessageToLog('Проверка файлов завершена! ', 'Checking files complited!', MainForm.log);
    MainForm.NewCountDesc.Caption := Translator('Новых файлов: ' + IntToStr(FilesToGet.Count), 'New Files: ' + IntToStr(FilesToGet.Count));
    MainForm.StatusBar.Panels[1].Text := Translator('', '');
    FilesToGet.SaveToFile(myDir + 'NewFiles.lst');
    FilesToGet.Free;
    Result := True;
    List.Free;
  end
  else
  begin
    Translator_MessageToLog('[Ошибка] Список файлов ненайден! Проверка неудачна! Обновление неудачно!', '[Error] Files-list not found! Cheking failed! Updating failed!', MainForm.log);
    MainForm.StatusBar.Panels[1].Text := Translator('Проверка файлов неудачна!', 'Checking files Failed!');
    FilesToGet.Free;
    Result := False;
    List.Free;
  end;
end;
Продолжение в след. сообщении...
Человек_Борща вне форума Ответить с цитированием
Старый 04.08.2010, 13:45   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию продолжение первого поста

Продолжение модуля:
Код:
{-------------------------------------------------------------------------------
  Функция: THttpThread.HTTPGetFiles
  Автор:    ArhangeL
  Дата:  2010.08.04
  Входные параметры: Нет
  Результат:    Boolean
  Описание: функция открывает файл NewFiles.lst и чтает его, загружая каждый файл по списку вниз.
  Если загружен то возвращает true иначе false
-------------------------------------------------------------------------------}
function THttpThread.HTTPGetFiles:Boolean;
var
  i: Integer;
  FD: Boolean;
begin
  Result:=False;
  myDir := IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)));
  FilesURL := AdminForm.HTTPFilesEdit.Text;
  if FileExists(myDir+'NewFiles.lst') then
  begin
   FilesToGet:=TStringList.Create;
   try
   FilesToGet.LoadFromFile(myDir+'NewFiles.lst');
   except
   Translator_MessageToLog('[Ошибка] Не удалось прочитать список файлов! Загрузка неудачна! Обновление неудачно!', '[Error] Unable to read file list! Downloading failed! Updating failed!', MainForm.log);
   MainForm.StatusBar.Panels[1].Text := Translator('', '');
   MainForm.FileProgressDesc.Caption := Translator('Файл: ', 'File: ');
   FilesToGet.Free;
   Result:=False;
   end;

    for i := 0 to FilesToGet.Count-1 do
    begin
    SendMessage(MainForm.Handle, PROGRESS_MAX, 1, FilesToGet.Count-1);
      MainForm.StatusBar.Panels[1].Text := Translator('Загрузка файлов', 'Downloading files');
      MainForm.FileProgressDesc.Caption := Translator('Файл: ' + FilesToGet.Strings[i], 'File: ' + FilesToGet.Strings[i]);

      if (not DirectoryExists(myDir+ExtractFilePath(FilesToGet.Strings[i]))) then
        ForceDirectories(myDir+ExtractFilePath(FilesToGet.Strings[i]));
      FD := HTTPGetFile(FilesURL + ExtractFileName(FilesToGet.Strings[i]), myDir + FilesToGet.Strings[i], True);
      if (FD) then
      begin
        Translator_MessageToLog('Файл: ' + ExtractFileName(FilesToGet.Strings[i])+' успешно загружен!', 'File: ' + ExtractFileName(FilesToGet.Strings[i])+' succsesfly downloaded!', MainForm.log);
      end
      else
      begin
        Translator_MessageToLog('Не удалось загрузить: ' + ExtractFileName(FilesToGet.Strings[i]), 'Bad load: ' + ExtractFileName(FilesToGet.Strings[i]), MainForm.Log);
        Break;
      end;
      SendMessage(MainForm.Handle, PROGRESS, 1,i);
    end;
  MainForm.StatusBar.Panels[1].Text := Translator('Загрузка завершена!', 'Downloading Complited!');
  MainForm.FileProgressDesc.Caption := Translator('Файл: ', 'File: ');
  SendMessage(MainForm.Handle, PROGRESS, 1,0);
  Translator_MessageBox('Все файлы успешно загружены!','All downloads succsesfly complited!','Успешно ;)','Succsesfly ;)',MB_OK or MB_ICONINFORMATION);
  FilesToGet.Free;
  Result:=True;
end else
begin
Translator_MessageToLog('[Ошибка] Список файлов ненайден! Загрузка неудачна! Обновление неудачно!', '[Error] Files-list not found! Downloading failed! Updating failed!', MainForm.log);
Result:=False;
FilesToGet.Free;
MainForm.StatusBar.Panels[1].Text := Translator('', '');
MainForm.FileProgressDesc.Caption := Translator('Файл: ', 'File: ');
end;
end;
вот код загрузки файла:
Код:
function HTTPGetFile(const FileURL,FileSaveDest:string;ShowProgress:Boolean):Boolean;
const
  BufferSize=1024;  //size of buffer
var
  hSession,hURL:HInternet;
  Buffer: array[0..BufferSize] of Byte;
  BufferLen:LongWord;
  Files:TFileStream;
  Header,pAppName:string;
begin
  Result:=False;
  pAppName:='AppProgram';
  Header:='User-Agent: AppProgram';
  hSession:=InternetOpen(PChar(pAppName),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  try
  hURL:=InternetOpenUrl(hSession,PChar(FileURL),PChar(Header),Length(header),INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD,0);

  if (hURL<>nil) then
  begin
  try
  DeleteUrlCacheEntry(PChar(FileURL));
  Files:=TFileStream.Create(FileSaveDest,fmCreate);
  repeat
    InternetReadFile(hURL,@Buffer, SizeOf(Buffer),BufferLen);
    Files.WriteBuffer(Buffer,BufferLen);
    if (ShowProgress) then
    begin
    LT:=LT+BufferLen;
    SendMessage(MainForm.Handle,PROGRESS,0,LT+BufferLen);
    end;
    until
    BufferLen= 0;
    FreeAndNil(Files);
    Result:=True;
    finally
      InternetCloseHandle(hURL);
      end;
      end;
     finally
     InternetCloseHandle(hSession);
  end;
  LT:=0;
  SendMessage(MainForm.Handle,PROGRESS,0,0);
end;
программа нормально функционирует! НО загружает только про 322 байта каждого файла.. ПОЧЕМУ?
Помогите пожалуйста найти ошибку=)

ошибок не выдает...
Человек_Борща вне форума Ответить с цитированием
Старый 04.08.2010, 14:17   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Самое лучшее что ты можешь сделать это пройти по шагам по программе, и посмотреть в какие моменты у тебя BufferLen=0, вдруг вылет из цикла идет не вовремя..
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
preg_match в PHP 5.3 "клюёт" только на первые символы? _PROGRAMM_ PHP 3 12.05.2010 19:05
почему элемент массива char* весит 4 байта? Познающий Помощь студентам 6 09.12.2009 21:06
Обрезать у файлов первые 24 байта и переименовать в соответствии со списком. Hell'ena Общие вопросы Delphi 13 12.07.2008 20:48
Почему ошибка только в DLL? AidarBik Общие вопросы Delphi 13 08.10.2007 14:49