Russian Qt Forum
Ноябрь 25, 2024, 18:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: перенос файла(rename)  (Прочитано 5022 раз)
denis
Гость
« : Октябрь 26, 2012, 13:14 »

нужно написать функцию, которая будет переносить файлы или папки и отображать прогресс.
функция QFile::rename не подходит, т.к. не может показать прогресс переноса.

если писать самому функцию переноса, то не ясен один момент.
1. если файл переносится с одного тома на другой, то сначала происходит копирование, потом удаление. тут всё ясно.
2. если файл переносится в пределах одного тома, то как определить это, что в пределах одного тома? в Windows можно определить по диску, но как это определить в мак ос и линукс?
Записан
Fat-Zer
Гость
« Ответ #1 : Октябрь 26, 2012, 15:08 »

в Windows можно определить по диску,
вообще говоря, нельзя... он тоже умеет монтировать диски в каталоги...
но как это определить в мак ос и линукс?
man stat, внимание на поле st_dev.

но я бы не спешил свои велосипеды делать... лучше пару раз просмотреть доки - для этого должны быть qt'шные функции...
Записан
denis
Гость
« Ответ #2 : Октябрь 26, 2012, 15:32 »

в том то и дело, не нашел ничего
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 26, 2012, 15:35 »

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

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

а остался исходник?)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 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
Записан
denis
Гость
« Ответ #6 : Октябрь 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? только для мака есть?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 26, 2012, 20:18 »

а что такое Files.h? только для мака есть?
Ну да. Цитированием не злоупотребляйте, необязательно копировать простыню, можно написать строку - и так понятно о чем речь  Улыбающийся
Записан
Serr500
Гость
« Ответ #8 : Октябрь 26, 2012, 21:32 »

в Windows можно определить по диску,
вообще говоря, нельзя... он тоже умеет монтировать диски в каталоги...
По букве диска можно в подавляющем большинстве случаев, поскольку смонтированный в каталог диск - редкость. Но если нужно сделать всё "по уму", то нужно работать с точками монтирования. Два объекта файловой системы находятся на одном логическом томе в том случае, когда для них функция GetVolumePathName вернёт одинаковые значения точек монтирования.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.