Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> C++Builder - копирование файлов
avtor
сообщение 17.05.2008 - 13:01

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Есть такая задача: скопировать файл, находящийся в одной директории, и создать его копию в другой.
Файл может быть текстовым, а может двоичным.
Как это можно сделать в C++Builder ?
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 17.05.2008 - 19:10

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


И для чего господь дал человеку гугль? smile.gif

Код
//Will FileTo.txt be overwritten if it already exists? No.
const bool failIfExists = true;
CopyFile( "FileFrom.txt","FileTo.txt", failIfExists);


Сообщение отредактировано Graker - 17.05.2008 - 19:11
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 17.05.2008 - 19:50

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


FileFrom.txt - как я понимаю, путь к исходному файлу
FileTo.txt - как я понимаю, путь к новому файлу
failIfExists - а это что?
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 17.05.2008 - 19:52

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(avtor @ 17.05.2008 - 20:50) *
FileFrom.txt - как я понимаю, путь к исходному файлу
FileTo.txt - как я понимаю, путь к новому файлу
failIfExists - а это что?

failIfExists - отмена копирования, если FileTo.txt уже существует. true - будет отмена, false - файл будет перезаписан.
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 17.05.2008 - 19:58

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


У меня почему-то эта функция не работает. Что не так? Вот фрагмент кода:

CreateDir ("C:\\localhost\\htdocs\\chet");
CopyFile ("C:\\localhost\\htdocs\\chet\\chet.txt", "C:\\Documents and Settings\\All Users\\Рабочий стол\\IKS\\htdocs\\chet\\chet.txt", true);
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 17.05.2008 - 20:00

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(avtor @ 17.05.2008 - 20:58) *
У меня почему-то эта функция не работает. Что не так? Вот фрагмент кода:

CreateDir ("C:\\localhost\\htdocs\\chet");
CopyFile ("C:\\localhost\\htdocs\\chet\\chet.txt", "C:\\Documents and Settings\\All Users\\Рабочий стол\\IKS\\htdocs\\chet\\chet.txt", true);


Как я понимаю, ты сначала создаешь директорию c:\\localhost\\htdocs\\chet, а потом хочешь в нее скопировать файл. Это правильно?
Если так, то ты перепутал FileFrom и FileTo. Первый аргумент - источник, второй аргумент - приемник.

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

Сообщение отредактировано Graker - 17.05.2008 - 20:02
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 17.05.2008 - 20:48

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Виноват, действительно поменял местами.
Graker - спасибо!

Еще вопрос: нужно, чтобы при нажатии кноки на форме запускался файл с расширением .exe или .msi.
Как это можно сделать?
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 18.05.2008 - 09:26

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Необходимо, чтобы родительское приложение при этом не закрывалось.
Перейти в начало страницы
 
+Цитировать сообщение
Phoenix
сообщение 18.05.2008 - 13:12

void*
******
орден IV степени
Группа: Участник
Сообщений: 1631
Регистрация: 29.09.2003
Пользователь №: 45


::CreateProcess, ничего нового.
В целом же, очень рекомендую разжиться последним MSDN-ом (или хотя бы его онлайновым вариантом msdn.microsoft.com) для более подробного разруливания, что куда и почему.
PS. была еще такая функция - WinExec, очень сильно deprecated, зато параметров мало и они понятные. Может еще работает, хотя это крайний случай, если не удастся победить CreateProcess.
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 20.05.2008 - 14:15

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Столкнулся с такой проблемой. Есть код:

AnsiString directo = DirectoryListBox1 -> Items -> Strings[i];
AnsiString fil = FileListBox1 -> Items -> Strings[t];
CopyFile ("C:\\Documents and Settings\\All Users\\Рабочий стол\\IKS\\htdocs\\" + directo + "\\" + fil,
"C:\\localhost\\htdocs\\" + directo + "\\" + fil, false);

При попытке компиляции программа сообщает, что переменные directo и fil должны иметь тип char.

Что сделать, чтобы привести их к нужному виду?
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 20.05.2008 - 14:39

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(avtor @ 20.05.2008 - 15:15) *
Столкнулся с такой проблемой. Есть код:

AnsiString directo = DirectoryListBox1 -> Items -> Strings[i];
AnsiString fil = FileListBox1 -> Items -> Strings[t];
CopyFile ("C:\\Documents and Settings\\All Users\\Рабочий стол\\IKS\\htdocs\\" + directo + "\\" + fil,
"C:\\localhost\\htdocs\\" + directo + "\\" + fil, false);

При попытке компиляции программа сообщает, что переменные directo и fil должны иметь тип char.

Что сделать, чтобы привести их к нужному виду?


1. Наверное, он сказал не "char", а "char *", правильно? Для получения указателя на null-terminated-строку нужно вызвать метод char * AnsiString::c_str().

2. Проще всего сделать вот так:
Код
AnsiString directo = DirectoryListBox1 -> Items -> Strings[i];
AnsiString fil = FileListBox1 -> Items -> Strings[t];
AnsiString asSource = "C:\\Documents and Settings\\All Users\\Рабочий стол\\IKS\\htdocs\\" + directo + "\\" + fil;
AnsiString asDest = "C:\\localhost\\htdocs\\" + directo + "\\" + fil;
CopyFile (asSource.c_str(),asDest.c_str(), false);


P.S. Автор, без обид, но у тебя хелп к билдеру как, не установлен, или не читабелен? smile.gif

Сообщение отредактировано Graker - 20.05.2008 - 14:40
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 20.05.2008 - 17:01

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Я в английском катастрофически слаб, а в книгах, что у меня есть, информация очень урезанная - многие встроенные функции и свойства компонентов вообще не упоминаются.
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 20.05.2008 - 17:22

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(avtor @ 20.05.2008 - 18:01) *
Я в английском катастрофически слаб

Эээ, в таком разрезе осваивать программирование на чем-либо в три раза сложнее ohmy.gif

Однако могу посоветовать поискать в Яндексе. В Рунете есть некоторое количество сайтов, описывающих все (ну, или почти все) классы vcl-библиотеки, используемой в IDE борланда, на родном языке. Сайты по Delphi тоже подойдут: библиотека та же, классы почти не различаются.

*посыпая голову пеплом* У меня раньше была огромная куча faq-ов, man-ов, статей и советов по delphi и c++ builder, многое на русском. Стер за ненадобностью в припадке наведения чистоты. Впрочем, я их из инета тащил, так что и ты найдешь, если что smile.gif

Кстати, то, что многие свойства/методы не упоминаются - это, возможно, ввиду их наследования от базовых классов, т.е. нужно читать описание классов-родителей.

Сообщение отредактировано Graker - 20.05.2008 - 17:24
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 20.05.2008 - 17:28

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Теперь компиляция проходит нормально, но копирования файлов почему-то не происходит.
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 20.05.2008 - 17:30

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Ставь breakpoint, исполняйся до него, жми alt+ctrl+L, смотри содержимое переменных с путями smile.gif
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 20.05.2008 - 17:39

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Для меня это надо расшифровать.
Например, что такое breakpoint и где его искать.
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 20.05.2008 - 18:44

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Цитата(avtor @ 20.05.2008 - 18:39) *
Для меня это надо расшифровать.
Например, что такое breakpoint и где его искать.

Breakpoint - это точка останова, ключевой момент отладки приложений. Ставишь ее на какой-нибудь исполняемой строке программы, и при исполнении (в режиме отладки, конечно) программа остановится на этой строке, чтобы ты мог просмотреть значения своих переменных и т.п. Чтобы ее поставить в c++ builder, нужно нажать F5 на той строке, на которой ты хочешь остановиться. Точка останова незамедлительно появится слева от строки (красный кружок). Также можно ее ставить/снимать, щелкая левой кнопкой мыши в той области, где она появляется.

По alt+clrt+L откроется окно Locals, показывающее тебе значения переменных в контексте исполняемой в данный момент функции (т.е. значения локальных переменных). По alt+ctrl+W откроется окно Watches, где ты сможешь сам указать, какие переменные отслеживать (в глобальном и локальном контексте).

P.S. Ты раньше только серверными скриптами и т.п. занимался? Если так, то стоит прочитать целиком книжку по c++ или по используемой IDE (а лучше обе). Многие вопросы сами собой отпадут.
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 20.05.2008 - 20:01

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


И читал книжки по С++, и делал приложения на C++Builder.

С предыдущей проблемой разобрался. Теперь другая беда:

AnsiString direc = DirectoryListBox1 -> Items -> Strings[i];
DirectoryListBox3 -> Directory = "C:\\Documents and Settings\\All Users\\Рабочий стол\\IKS\\htdocs\\" + direc;

Программа с этим фрагментом кода компилируется, но при выполнении выдает ошибку I/O error 123. Причем, вся проблема именно в этом +direc.

Удаляю этот фрагмент кода - все работает без ошибок.

Сообщение отредактировано avtor - 20.05.2008 - 20:30
Перейти в начало страницы
 
+Цитировать сообщение
Graker
сообщение 20.05.2008 - 21:20

Частый гость
***

Группа: Участник
Сообщений: 182
Регистрация: 5.01.2006
Пользователь №: 11345


Как понять, что такое "DirectoryListBox3 -> Directory"? Это какого класса объект? В TListBox нет свойства Directory, судя по хелпу vcl. Что мы должны понять из приведенного отрывка?

Цитата(avtor @ 20.05.2008 - 21:01) *
И читал книжки по С++, и делал приложения на C++Builder.

Гм. Тогда, извини, непонятно, откуда возникают все эти вопросы.

upd: аа, сообразил, что за класс. Непонятно, что записано в строке direc. Как ни крути - от отладки тебе не уйти smile.gif

Сообщение отредактировано Graker - 20.05.2008 - 22:27
Перейти в начало страницы
 
+Цитировать сообщение
avtor
сообщение 20.05.2008 - 22:28

Постоялец форума
*****

Группа: Участник
Сообщений: 978
Регистрация: 15.04.2004
Пользователь №: 3224


Цитата(Graker @ 20.05.2008 - 22:20) *
Как понять, что такое "DirectoryListBox3 -> Directory"? Это какого класса объект? В TListBox нет свойства Directory, судя по хелпу vcl. Что мы должны понять из приведенного отрывка?
Гм. Тогда, извини, непонятно, откуда возникают все эти вопросы.

Код правильный, DirectoryListBox - компонент вкладки Windows3.1, Directory - его свойство, в котором программно устанавливается текущая папка.
Ошибку нашел - она в том, что я забывал удалять из списка вышестоящие папки.
Перейти в начало страницы
 
+Цитировать сообщение

2 страниц V   1 2 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 26.04.2024 - 16:39