Страница 1 из 2
Копирование файлов на С
Добавлено: 11 янв 2016, 02:38
Skwoogey
У меня не хочет работать второй utime(именно второй, потому что если поменять их местами, вывод все равно тем же будет, то есть первый раз при выполнении он работает, а второй раз - нет). Нигде подобного случая не нашел. В чем косяк, понять не могу. Нужна помощь.
Для справки:
utime выдает 0, если успешно, и -1 если провал.
Код: Выделить всё
#include <stdio.h>
#include <dirent.h>
#include <utime.h>
int main()
{
int test;
struct utimbuf tm1,tm2;
...
test = utime("C:\\sample2\\file1.txt",&tm2);
printf("%d\n",test);
test = utime("C:\\sample1\\file1.txt",&tm1);
printf("%d\n",test);
}
Вывод:
0
-1
Re: функция int utime (const char *filename, const struct utimbuf *times)
Добавлено: 11 янв 2016, 09:09
Romeo
Компилируешь MinGW, правильно? Просто функция
utime исключительно линуксовая, а пути к файлам у тебя виндовые. Здесь только MinGW подходит. Я понимаю, что можно догадаться, но лучше это сразу указывать, чтобы народ голову не ломал.
Какими значениями заполняются поля tm1 и tm2? Если их не заполнять вообще, то у меня два раза -1 возвращает, и это логично.
Re: функция int utime (const char *filename, const struct utimbuf *times)
Добавлено: 11 янв 2016, 10:46
Skwoogey
Простите, я идиот. Я небрежно прочитал документацию к функции. В итоге оказалось, что она мне не нужна. Но все равно спасибо за помощь. Я учту ваши замечания.
P.S.
В си есть копирование файлов кроме варварского создания аналогичного и последующего побайтового копирования из оригинала в копию?
Re: функция int utime (const char *filename, const struct utimbuf *times)
Добавлено: 11 янв 2016, 10:56
Romeo
Если привязка с Windows позволительна, то самое простое и правильное - это вызывать
CopyFile.
Если же требуется кроссплатформенное решение то, да, очевидных способов кроме как через буфер делать fread/fwrite нет.
Есть ещё вот
такие варианты, но это для nix систем.
Re: функция int utime (const char *filename, const struct utimbuf *times)
Добавлено: 11 янв 2016, 14:28
Skwoogey
В общем, я тут пытался сделать функцию, но запоролся. Моя функция копирует файлы без содержимого. В чем проблема - понять не могу.
Код: Выделить всё
void copyfile(char *file,int mode)
{
FILE *fp1,*fp2;
char bak[100];
name_maker(bak,file,mode);
puts(bak);
if((fp1 = fopen(bak, "rb")) == NULL)
puts("net1");
char file_nm[100];
name_maker(file_nm,file,-mode);
puts(file_nm);
if((fp2 = fopen(file_nm,"wb")) == NULL)
puts("net2");
int rc;
char k;
while(fread(k, sizeof(k), 1,fp1) != 0)
{
fwrite(k, sizeof(k), 1, fp2);
}
fclose(fp1);
fclose(fp2);
}
name_maker собирает строку полного пути. Он работает правильно. Переменная mode тоже для него.
Заранее спасибо.
Mingw, Win 8.1
Re: функция int utime (const char *filename, const struct utimbuf *times)
Добавлено: 11 янв 2016, 15:39
Romeo
Функции fread/fwrite получают адрес буфера, так что поставь амперсанд перед k.
И ещё посоветую увеличить размер буфера хотя бы до пары десятков килобайт, а желательно вообще сделать его мегабайтным.
И, кстати, почему не воспользоваться CopyFile, ведь для MinGW это не проблема? Эта функция произведёт копирование заведомо более оптимально.
Re: функция int utime (const char *filename, const struct utimbuf *times)
Добавлено: 11 янв 2016, 15:54
Skwoogey
Теперь у меня файлы битые получаются, судя по всему недописанные или переписанные. Они близки по размеру, но не равны.
Romeo писал(а):
И, кстати, почему не воспользоваться CopyFile, ведь для MinGW это не проблема? Эта функция произведёт копирование заведомо более оптимально.
Мне нужен универсальный код.
Re: Копирование файлов на С
Добавлено: 11 янв 2016, 15:58
Romeo
"Теперь" - это после того, как буфер сделал большим?
Дело в том, что нужно писать столько, сколько вернул fread, а не весь буфер. В конце ведь буфер не полностью заполняется, и если писать его целиком, то запишешь кусок повторяющихся данных в хвосте, записанных предыдущем fread'ом.
Код: Выделить всё
char k[10000];
size_t bytesCount;
while((bytesCount = fread(k, sizeof(k), 1, fp1)) != 0)
{
fwrite(k, bytesCount, 1, fp2);
}
Re: Копирование файлов на С
Добавлено: 11 янв 2016, 16:14
Skwoogey
Ладно. С переписанными файлами фишку понял, но недописанные все еще есть. причем, чем я больше делаю строку, тем недобор больше.
Re: Копирование файлов на С
Добавлено: 11 янв 2016, 16:15
Duncon
А чего условную компиляцию не использовать для универсального кода?