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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile::copy - проблема с русскими именами в файлах и директориях..  (Прочитано 12213 раз)
CProger
Гость
« : Апрель 06, 2010, 22:00 »

Возникла проблема с вот таким кодом:
Код
C++ (Qt)
QFile fileFrom( "c:/папка-с-русскими-символами/file.exe" );
if( fileFrom.copy( "c:/test/dest.exe" ) ){
..ok..
} else {
..fail..
}

собсно пользователю не запретишь использовать русские буквы в названиях директорий. Может кто находил выход из такой ситуации?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Апрель 06, 2010, 22:13 »

И какого рода проблема?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
CProger
Гость
« Ответ #2 : Апрель 06, 2010, 22:15 »

а проблема в том, что этот код всегда ошибку выдаёт Улыбающийся в винде, по крайней мере.
Всё остальное копирует отлично, а как русские буквы - так false возвращает..

Пробовал и через QString::fromUtf8() передать русские имена.. но всё равно не прокатывает.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Апрель 07, 2010, 00:10 »

собсно пользователю не запретишь использовать русские буквы в названиях директорий. Может кто находил выход из такой ситуации?

Код
C++ (Qt)
QFile fileFrom(QFile::decodeName("c:/папка-с-русскими-символами/file.exe")) ;
 

Всё равно лучше дать возможность ользователю выбрать файл через QFileOpenDialog, там уже decodeName() не понадобится. Плюс, от захардкоденых путей с неанглийскими симвоалами могут быть проблемы на других системах и локалях.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Апрель 07, 2010, 01:42 »

Тема заинтересовала...
Хотя у меня почему-то, если использовать QFile::decodeName(), то русский путь к файлу в консоль qDebug() выводит как надо, но копирования всё равно не происходит (а без этого метода и в консоль будет выводиться кадабра).
Пробовал setEncodingFunction() и setDecodingFunction() и
Код:
QTextCodec *tc = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForTr(tc);
тож ноль эффекта. Не копируецца Улыбающийся
« Последнее редактирование: Апрель 07, 2010, 01:46 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
crackedmind
Гость
« Ответ #5 : Апрель 07, 2010, 05:51 »

Код:
#include <QtCore>

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);
    QTextCodec *tc = QTextCodec::codecForName("windows-1251");

    QTextCodec::setCodecForCStrings ( tc )  ;

    QFile necro("C:/Некрономикон.pdf");
    bool res = necro.copy("C:/Necronomycon.pdf");
   
    if ( !res )
        qDebug() << necro.errorString();
    else
        qDebug() << "OK";
}
// Output: OK
Итог: Не забывайте для C-строк, указывать ту кодировку в которой у вас сохранен исходный код.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Апрель 07, 2010, 06:18 »

1. Не используйте в коде символы, отличные от латиницы.
2. Зачем хардкодить пути в коде?
« Последнее редактирование: Апрель 07, 2010, 06:24 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Апрель 07, 2010, 11:13 »

crackedmind, ага, теперь копируется. А почему ставить кодек надо именно для CStrings?
Пантер, так ведь никто не спорит. Лично мне это интересно исключительно ради опыта. Мало ли, вдруг пригодится в какой-то косвенной ситуации.
Записан

kubuntu/Win7/x64/NetBeans
crackedmind
Гость
« Ответ #8 : Апрель 07, 2010, 13:30 »

Цитата: Пантер
1. Не используйте в коде символы, отличные от латиницы.
2. Зачем хардкодить пути в коде?
Однако, если считывать путь из txt файла проблема будет таже.

Цитата: serg_hd
crackedmind, ага, теперь копируется. А почему ставить кодек надо именно для CStrings?

Цитата из Асистента:
Цитата: Qt Assistant
Sets the codec used by QString to convert to and from const char * and QByteArrays. If the codec is 0 (the default), QString assumes Latin-1.
А "c:/путь/файл" уже является char *
Записан
niXman
Гость
« Ответ #9 : Апрель 07, 2010, 18:55 »

о ужос! Шокированный
это просто мегапроблема! Смеющийся

как-то так:
Код
C++ (Qt)
boost::filesystem::copy_file("from", "to");
 

или самопал:
Код
C++ (Qt)
void copyfile(const std::string& to, const std::string& from) {
  std::ofstream(to.c_str(), std::ios::binary) << std::ifstream(from.c_str(), std::ios::binary).rdbuf();
}
 

и естественно, для QFile и подобных, не существует итераторов. и естественно, к QFile и подобным, невозможно применить алгоритмы Смеющийся
Записан
zenden
Гость
« Ответ #10 : Апрель 07, 2010, 19:22 »

ага, но для QFile и подобных, компилятор не задыхается из-за обилия шаблонов и не компилирует по полчаса
Записан
niXman
Гость
« Ответ #11 : Апрель 07, 2010, 19:36 »

самый весомый аргумент Смеющийся
intel 80386 ? Подмигивающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Апрель 08, 2010, 06:19 »

niXman, тебе не кажется, что вопрос был совсем о другом?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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