Delphi копирование файла код ошибки
Репутация: нет
Всего: 6
Я не понимаю как получить из этого данные. И почему то поток вываливается
1. Помогите мне в примере вывести ProgressBar и количество скопированных байт.
2. Где ошибка, почему вываливается поток при копировании фала 2,6 гб
Присоединённый файл ( Кол-во скачиваний: 6 )
1.rar 8,86 Kb
Репутация: нет
Всего: 98
1 -- а в чем, собственно, проблема? делаеш у потока два свойства и в главной форме по таймеру их опрашиваеш (самый простой вариант)
2 -- для начала реализуй копирование вне потока (попутно и ошибку найдеш)
Репутация: нет
Всего: 6
Я ж написал , я ничего не понимаю в потоках, хотелось на практике в примере пояснения видеть А просто копировать не получиться из этого примера.
Репутация: нет
Всего: 98
Цитата(ZBugz @ 28.11.2006, 16:26 ) |
Я ж написал , я ничего не понимаю в потоках |
Репутация: нет
Всего: 6
Так как в ссылках написанно, я делал, впринципе получалось.
На данный момент меня интересует почему он вываливается из потока и не копирует
А про прогресс я знаю и так.
Репутация: нет
Всего: 98
Цитата(ZBugz @ 28.11.2006, 17:02 ) |
А про прогресс я знаю и так. |
Цитата(ZBugz @ 28.11.2006, 15:41 ) |
1. Помогите мне в примере вывести ProgressBar и количество скопированных байт. |
Цитата(ZBugz @ 28.11.2006, 17:02 ) |
На данный момент меня интересует почему он вываливается из потока и не копирует |
вот поэтому и стоит реализовать для начала копирование без потока.
но если так уже хочется копировать в потоке -- можно и в нем: ставь бряку на Execute и step over до появления ошибки.
Репутация: нет
Всего: 6
Код |
вот поэтому и стоит реализовать для начала копирование без потока. но если так уже хочется копировать в потоке -- можно и в нем: ставь бряку на Execute и step over до появления ошибки. |
Без потока я знаю как копировать, в этом проблем нет. Просто мне нужно именно так или что то похожее, чтоб фалы большого размера скопировать можно было и если прервалось из за ошибки или прирвали, оно докачалось.
Выявить ошибку не могу, это же поток, он вываливается и ничего вообще не пишет
Поэтому я и выложил пример, чтоб на него посмотрели.
И кстати, раньше всегда помогали с примером, а щас нет
Репутация: 32
Всего: 61
M Kuvaldis | В названии темы не указан язык программирования! |
Репутация: 6
Всего: 158
ZBugz,
тебе правильно сказали, чтоб ты сначала без потоков сделал.
везде где у тебя написано Integer, напиши Int64
Репутация: нет
Всего: 6
Цитата(Kuvaldis @ 29.11.2006, 01:44) |
ZBugz В названии темы не указан язык программирования! |
Если я в Dlphi этот вопрос размещаю, так как вы думаете какой это язык программирования ?
Добавлено @ 09:47
Цитата(dumb @ 29.11.2006, 02:15) |
ZBugz, тебе правильно сказали, чтоб ты сначала без потоков сделал. везде где у тебя написано Integer, напиши Int64 |
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
[ Время генерации скрипта: 0.1474 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Добавлено через 41 минуту
проблема не в методе открытия а в копировании файла шаблона, т.е. файл не открывается потому что его нет.
копирование не происходит (SysErrorMessage(GetLastError)) говорит, "Системе не удается найти указанный путь"
почему.
Не работает копирование файла
hFile1:=CreateFileW('C:\proverka.txt',GENERIC_READ, 0, nil.
А разве путь у вас был в utf8 ? Вы же его берете из контрола VCL. Проверьте еще раз, что вы фактически передаете функции.
Укажите явно уникодный вариант функции CopyFileW
Путь к файлу - одна строка, а если путь содержит, ну например, имя таблицы, то CopyFile() уже не работает. Типа
'. \. \'+Table.Name+'\. \'
Зачем вы подняли тему 2013 года? Какие ещё таблицы?
Зачем вы подняли тему 2013 года? Какие ещё таблицы?
Путь к файлу - одна строка, а если путь содержит, ну например, имя таблицы, то CopyFile() уже не работает
Вы динамически в пути для копирования ссылаетесь на таблицу из БД, так?
Покажите, как в проекте это реализовано или приложите архив с проектом.
Так пробовали?
P.S. Об этой "особенности" упомянуто в примерах по ссылке, которую я дал выше (если Вы ее смотрели внимательно)
// Путь к исходному файлу задается в поле Edit.
// Т.к. параметр не принимает стандартного строкового значения String,
// необходимо сделать приведение типа к PChar.
CopyFile(PChar(edt1.Text), 'newfile.txt', false);
Зачем? Если бы Вы изначально корректно сформулировали вопрос, проблем не было.
Вы динамически в пути для копирования ссылаетесь на таблицу из БД, так?
Покажите, как в проекте это реализовано или приложите архив с проектом.
Так пробовали?
P.S. Об этой "особенности" упомянуто в примерах по ссылке, которую я дал выше (если Вы ее смотрели внимательно)
Добавлено через 1 минуту
Или же удачи в поисках!
Да. была ошибка в:
if CopyFile('D:\ErrUpLink\Data\ErUpLinkN.ulk','D:\ErrUpLink\Dat a\'+Table.Name+'\ErUpLink.ulk',False) then
Благодарю. Постараюсь запомнить.
Да. была ошибка в:
if CopyFile('D:\ErrUpLink\Data\ErUpLinkN.ulk','D:\ErrUpLink\Dat a\'+Table.Name+'\ErUpLink.ulk',False) then
Благодарю. Постараюсь запомнить.
Тогда учтите ещё одно. В приведенном вами примере первый параметр функции CopyFile, а именно
'D:\ErrUpLink\Data\ErUpLinkN.ulk'
не нужно явно приводить к PChar
PChar('D:\ErrUpLink\Data\ErUpLinkN.ulk' )
Ибо это константа известная компилятору уже на этапе компиляции. И компилятор сам её представит функции так как она хочет. А вот второй параметр в таком приведении уже нуждается. Ибо на этапе компиляции он не известен. Его нужно вычислять в рантайме и только после этого приводить к PChar.
Копирование определенного текста из файла, копирование и вставка в статичную переменную
Доброго вечера. Делаю программу которая бы выводила погоду на сегодня через данные сайта. Завис на.
Копирование папки работает в Win7, но не работает в WinXP
Есть такой код, который работает на W7 но не работает на ХР(текст ошибки: не удается скопировать.
Копирование строк одного файла в соответствующие списку подстроки другого файла
Здравствуйте. Есть file.txt, имеющий форму: 1 US 11.11.11.11:80 2 US 22.22.22.22:80 3 US.
Нет другого такого процесса в программе инсталляции, который бы выглядел снаружи столь простым и был бы в реализации столь сложным, как копирование. Сложная фраза. В переводе на русский язык она означает, что сделать хорошую операцию копирования файлов нелегко :) Почему?
Потому что операция копирования файлов должна быть идеальной.
Начнём с самого просто случая — копирования одного файла. Для того, чтобы скопировать один файл, вы можете вызвать функцию Windows, которая называется CopyFile: Как видим, функции необходимо передать имена двух файлов: исходного и целевого. Третий параметр отвечает за то, как функция будет поступать, если целевой файл уже существует. Значение True говорит о том, что функция не будет копировать файл, значение False — о том, что целевой файл будет перезаписан.
Функция возвращает True, если операция копирования была успешно выполнена. Значение False подсказывает нам, что необходимо вызвать функцию GetLastError для того, чтобы узнать код произошедшей ошибки.
Эта функция работает очень надёжно, поскольку она является частью операционной системы и практически наверняка именно она тестировалась огромное количетво раз. Тем не менее, первое, на чём мы остановимся — что в этой функции нас не устраивает? У этой функции один недостаток, но он способен перекрыть все её достоинства. Мы не имеем доступа к процессу копирования. Это означает, что мы не можем показывать индикатор процесса копирования и не можем прервать функцию CopyFile, если пользователь нажал кнопку "Отмена" или клавишу Escape.
Насколько это важно? На этот вопрос вы вольны отвечать самостоятельно. Если вам потребуется копировать большое количество маленьких файлов, то для вас этот недостаток неважен. Если вы собираетесь копировать файлы размером в несколько мегабайт, то у пользователя вашей программы могут возникнуть определённые проблемы.
В Windows NT 4.0 появилась новая функция — CopyFileEx, которая позволяет снять все появившиеся проблемы, но добавляет ещё одну — она не работает в Windows 95. :)
В Delphi для копирования файлов, мы можем воспользоваться объектами класса
TFileStream. Например, так: Обработку ошибок, как говорится в таких случаях, я оставляю читателю в качестве упражнения. :)
Немного поговорим о приведённой процедуре. Саму операцию копирования выполняет метод CopyFrom. Если второй параметр этого метода равен нулю, то копируется сразу весь файл, в ином случае копируется указанное количество байтов. Мы можем копировать файл блоками, со всеми вытекающими отсюда преимуществами: Замечательные функции FileGetDate, FileSetDate, FileGetAttr, FileSetAttr выполняют очень важную работу, про которую не надо забывать: копируют дату создания файла и его атрибуты. Сейчас мы не будем углубляться в особенности файловой системы NTFS, в которой есть дата последней модификации файла и расширенные атрибуты, поскольку приведённого кода нам вполне для наших целей хватит. Примечание: Корректное копирование предполагает, что у целевого файла обязательно устанавливается флаг Archive. Я не буду углуляться в то, зачем это делается, тем более, что в нашем случае этого делать не обязательно.
Тем не менее, если вы хотите реализовать полноценную операцию копирования, не забудьте про эту маленькую особенность.
Давайте ознакомимся с набором функции необходимых для работы.
function FileCreate(const FileName: String): integer;
Создаёт файл в указанном пути FileName и возвращает индекс созданного файла. В случае ошибки при создании, она вернет -1.
function FileOpen(const FileName: String; Mode: LongWord): integer;
- fmOpenRead - открытие только на чтение
- fmOpenWrite - открытие только на запись
- fmOpenReadWrite - открытие и на чтение и на запись
function FileRead(handle: integer; var Buffer; Count: integer): integer;
Читает открытый или созданный файл. Вместо пути она принимает индекс файла handle. Buffer - куда будет записано содержимое. Count - количество байтов которое нужно прочитать.
function FileWrite(handle: integer; var Buffer; Count: integer): integer;
Аналогичная функция чтению, но вместо чтения она записывает содержимое размером Count (в байтах) переменной Buffer в файл.
function FileClose(handle: integer);
Закрывает файл, чтобы другие программы тоже имели доступ к нему.
function FileSearch(const Name, DirList: string): String;
Осуществляет поиск файла Name в одной или более папках DirList, отделённых друг от друга точкой с запятой. Необходимо указывать не только название папки, но и полный адрес этой папки.
Имя файла может быть, как файловым именем, так и полным адресом файла.
Если файл будет найден, то возвращается полный адрес файла включая имя файла, в случае не нахождения искомого файла будет возвращена пустая строка.
ПРЕДУПРЕЖДЕНИЕ: ВСЕГДА сначала поиск будет проходить в текущей папке, независимо от перечисленных директорий. Если файл обнаруживается там, то путь файла возращён не будет, а только имя файла.
function FileSeek(Handle, Offset, Origin: Integer): Integer;
- File_Begin (0) - Смещение (offset) рассчитывается относительно начала файла
- File_Current (1) - Смещение рассчитывается относительно текущей позиции в файле
- File_End (2) - Смещение рассчитывается относительно конца файла
Все с теорией мы покончили, теперь что-нибудь считаем. вытащим на форму 2 кнопки и Memo и напишем в обработчике события 1 кнопки OnClick следующий код: функция SizeOf возвращает размер типа или самой переменно в байтах, т.к. заранее размер строки неизвестен. скомпилируем и нажмем кнопочку.
Теперь прочитаем это. создаём обработчик события 2 кнопки OnClick и пишем код:
Репутация: 3
Всего: 17
Код |
copyfile(PChar('TableBD.mdb'),PChar(dir+'\TableDB.mdb'),false); |
Есть подозрения, видать не получается скопировать, т.к. это БД программы, и она в данный момент используется, но ошибку не бьет просто не копирует, отсюда вопрос как скопировать файл который в данный момент используется.
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
Репутация: 9
Всего: 130
Цитата(Palladin @ 10.6.2009, 02:13 ) |
Есть подозрения, видать не получается скопировать, т.к. это БД программы, и она в данный момент используется, |
Подозрения неверные: только что сейчас проверил именно на .mdb - всё отлично работает. Смотри, что у тебя в переменной dir: небось там путь несуществующий.
Репутация: 3
Всего: 17
Код |
copyfile(PChar('TableBD.mdb'),PChar('TableDB123.mdb'),false); |
т.е. пытаюсь просто скопировать в туже папку где и БД и лишь меняю имя, эффекта 0:(
Добавлено @ 01:27
пишу тоже самое, но уже с ata.txt все работает
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
Репутация: 23
Всего: 72
Есть мнение, что в GetCurrentDir - не тот путь, по которому лежит эта база.
Итого - не находится не Dest, a Source
Почти уверен, что это верное мнение
Добавлено через 53 секунды
Выход - либо воспользоваться SetCurrentDir, либо явно прописывать полный путь к базе, которую нужно скопировать.
Репутация: 3
Всего: 17
Код |
copyfile(PChar('G:\Documents and Settings\HeGrenade\Рабочий стол\НЕ УДАЛЯТЬ\l\v.0.9a\TableBD.mdb'),PChar('G:\Documents and Settings\HeGrenade\Рабочий стол\НЕ УДАЛЯТЬ\l\v.0.9a\Выгрузка\ata.mdb'),false); |
Добавлено через 57 секунд
2Kami есть предложения?
Добавлено через 9 минут и 42 секунды
Я выше попробовал полный путь, не помогло
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
Репутация: 23
Всего: 72
Цитата(Palladin @ 10.6.2009, 01:34 ) |
2Kami есть предложения? |
Репутация: 3
Всего: 17
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
Репутация: 23
Всего: 72
Цитата(Palladin @ 10.6.2009, 17:25 ) |
Ну дак всетаки, что делать? |
Цитата(kami @ 10.6.2009, 02:00 ) |
посмотреть, что выдает GetLastError |
Репутация: 3
Всего: 17
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
Репутация: 23
Всего: 72
Код |
MessageBox(0, @IntToStr(GetLastError)[1], 'Ошибка при копировании', MB_OK); |
Репутация: 36
Всего: 329
Цитата(kami @ 10.6.2009, 20:01) |
Понятно. После CopyFile поставь строчку |
Код |
MessageBox(0, @IntToStr(GetLastError)[1], 'Ошибка при копировании', MB_OK); |
Добавлено через 1 минуту и 15 секунд
Palladin, копировать занятый другой программой файл можно с помощью потока TFileStream.
Репутация: 3
Всего: 17
Код |
ERROR_FILE_NOT_FOUND2 (0x2) The system cannot find the file specified. |
Однако я еще раз говорю путь указон верно, я проверял на других файлах в этой же папке, не копирует только TableBD.mdb
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
Репутация: 23
Всего: 72
Цитата(Akella @ 10.6.2009, 21:01 ) |
Palladin, копировать занятый другой программой файл можно с помощью потока TFileStream. |
Как, если не секрет? В особенности если этот файл открыт в другой программе без FILE_SHARE_READ . (кроме шуток, действительно интересует этот вопрос).
Читайте также: