Russian Qt Forum

Qt => Общие вопросы => Тема начата: denis от Октябрь 26, 2012, 13:14



Название: перенос файла(rename)
Отправлено: denis от Октябрь 26, 2012, 13:14
нужно написать функцию, которая будет переносить файлы или папки и отображать прогресс.
функция QFile::rename не подходит, т.к. не может показать прогресс переноса.

если писать самому функцию переноса, то не ясен один момент.
1. если файл переносится с одного тома на другой, то сначала происходит копирование, потом удаление. тут всё ясно.
2. если файл переносится в пределах одного тома, то как определить это, что в пределах одного тома? в Windows можно определить по диску, но как это определить в мак ос и линукс?


Название: Re: перенос файла(rename)
Отправлено: Fat-Zer от Октябрь 26, 2012, 15:08
в Windows можно определить по диску,
вообще говоря, нельзя... он тоже умеет монтировать диски в каталоги...
но как это определить в мак ос и линукс?
man stat, внимание на поле st_dev.

но я бы не спешил свои велосипеды делать... лучше пару раз просмотреть доки - для этого должны быть qt'шные функции...


Название: Re: перенос файла(rename)
Отправлено: denis от Октябрь 26, 2012, 15:32
в том то и дело, не нашел ничего


Название: Re: перенос файла(rename)
Отправлено: Igors от Октябрь 26, 2012, 15:35
но я бы не спешил свои велосипеды делать... лучше пару раз просмотреть доки - для этого должны быть qt'шные функции...
в том то и дело, не нашел ничего
В свое время я тоже. Пришлось нырять в нативняк (Mac OSX)


Название: Re: перенос файла(rename)
Отправлено: denis от Октябрь 26, 2012, 15:59
но я бы не спешил свои велосипеды делать... лучше пару раз просмотреть доки - для этого должны быть qt'шные функции...
в том то и дело, не нашел ничего
В свое время я тоже. Пришлось нырять в нативняк (Mac OSX)

а остался исходник?)


Название: Re: перенос файла(rename)
Отправлено: Igors от Октябрь 26, 2012, 17:50
а остался исходник?)
Код
C++ (Qt)
#include <Files.h>
 
int main( void )
{
OSErr err;
const char * fileName = "/Users/igorigor/Desktop/Test.png";
 
// create FSRef
FSRef theRef;
Boolean isDirectory;
err = ::FSPathMakeRef((unsigned const char *) fileName, &theRef, &isDirectory);
if (err) return -1;
 
// get catalog info
FSCatalogInfo catalogInfo;
err = ::FSGetCatalogInfo(&theRef, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL);
if (err) return -1;
 
printf("Volume ref = %d\n", int(catalogInfo.volume));
 
// get volume name
HFSUniStr255 unicodeVolumeName;
FSVolumeInfoParam pb;
pb.whichInfo = kFSVolInfoNone;
pb.ioVRefNum = catalogInfo.volume;
pb.volumeIndex = 0;
pb.whichInfo = kFSVolInfoNone;
pb.volumeInfo = NULL;
pb.volumeName = &unicodeVolumeName;
pb.ref = &theRef;
 
err = ::PBGetVolumeInfoSync(&pb);
if (err) return -1;
 
char buf[256];
CFStringRef str = CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeVolumeName.unicode, unicodeVolumeName.length);
CFStringGetCString(str, buf, 255, kCFStringEncodingUTF8);
CFRelease(str);
 
printf("Volume name = %s\n", buf);
return 0;
}
 
С уникодм подправите (меня он не интересовал). Да, и имена томов НЕ уникальны - Вам нужен только volume ref


Название: Re: перенос файла(rename)
Отправлено: denis от Октябрь 26, 2012, 19:52
а остался исходник?)
Код
C++ (Qt)
#include <Files.h>
 
int main( void )
{
OSErr err;
const char * fileName = "/Users/igorigor/Desktop/Test.png";
 
// create FSRef
FSRef theRef;
Boolean isDirectory;
err = ::FSPathMakeRef((unsigned const char *) fileName, &theRef, &isDirectory);
if (err) return -1;
 
// get catalog info
FSCatalogInfo catalogInfo;
err = ::FSGetCatalogInfo(&theRef, kFSCatInfoVolume, &catalogInfo, NULL, NULL, NULL);
if (err) return -1;
 
printf("Volume ref = %d\n", int(catalogInfo.volume));
 
// get volume name
HFSUniStr255 unicodeVolumeName;
FSVolumeInfoParam pb;
pb.whichInfo = kFSVolInfoNone;
pb.ioVRefNum = catalogInfo.volume;
pb.volumeIndex = 0;
pb.whichInfo = kFSVolInfoNone;
pb.volumeInfo = NULL;
pb.volumeName = &unicodeVolumeName;
pb.ref = &theRef;
 
err = ::PBGetVolumeInfoSync(&pb);
if (err) return -1;
 
char buf[256];
CFStringRef str = CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeVolumeName.unicode, unicodeVolumeName.length);
CFStringGetCString(str, buf, 255, kCFStringEncodingUTF8);
CFRelease(str);
 
printf("Volume name = %s\n", buf);
return 0;
}
 
С уникодм подправите (меня он не интересовал). Да, и имена томов НЕ уникальны - Вам нужен только volume ref

спасибо большое) а что такое Files.h? только для мака есть?


Название: Re: перенос файла(rename)
Отправлено: Igors от Октябрь 26, 2012, 20:18
а что такое Files.h? только для мака есть?
Ну да. Цитированием не злоупотребляйте, необязательно копировать простыню, можно написать строку - и так понятно о чем речь  :)


Название: Re: перенос файла(rename)
Отправлено: Serr500 от Октябрь 26, 2012, 21:32
в Windows можно определить по диску,
вообще говоря, нельзя... он тоже умеет монтировать диски в каталоги...
По букве диска можно в подавляющем большинстве случаев, поскольку смонтированный в каталог диск - редкость. Но если нужно сделать всё "по уму", то нужно работать с точками монтирования. Два объекта файловой системы находятся на одном логическом томе в том случае, когда для них функция GetVolumePathName (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364996%28v=vs.85%29.aspx) вернёт одинаковые значения точек монтирования.