Russian Qt Forum

Qt => Общие вопросы => Тема начата: CProger от Апрель 06, 2010, 22:00



Название: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: CProger от Апрель 06, 2010, 22:00
Возникла проблема с вот таким кодом:
Код
C++ (Qt)
QFile fileFrom( "c:/папка-с-русскими-символами/file.exe" );
if( fileFrom.copy( "c:/test/dest.exe" ) ){
..ok..
} else {
..fail..
}

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


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: pastor от Апрель 06, 2010, 22:13
И какого рода проблема?


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: CProger от Апрель 06, 2010, 22:15
а проблема в том, что этот код всегда ошибку выдаёт :) в винде, по крайней мере.
Всё остальное копирует отлично, а как русские буквы - так false возвращает..

Пробовал и через QString::fromUtf8() передать русские имена.. но всё равно не прокатывает.


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: Alex Custov от Апрель 07, 2010, 00:10
собсно пользователю не запретишь использовать русские буквы в названиях директорий. Может кто находил выход из такой ситуации?

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

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


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


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: crackedmind от Апрель 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-строк, указывать ту кодировку в которой у вас сохранен исходный код.


Название: Re: QFile::copy - проблема с русскими именами в файлах и д
Отправлено: Пантер от Апрель 07, 2010, 06:18
1. Не используйте в коде символы, отличные от латиницы.
2. Зачем хардкодить пути в коде?


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: serg_hd от Апрель 07, 2010, 11:13
crackedmind, ага, теперь копируется. А почему ставить кодек надо именно для CStrings?
Пантер, так ведь никто не спорит. Лично мне это интересно исключительно ради опыта. Мало ли, вдруг пригодится в какой-то косвенной ситуации.


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: crackedmind от Апрель 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 *


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: niXman от Апрель 07, 2010, 18:55
о ужос! :o
это просто мегапроблема! ;D

как-то так:
Код
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 и подобным, невозможно применить алгоритмы ;D


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: zenden от Апрель 07, 2010, 19:22
ага, но для QFile и подобных, компилятор не задыхается из-за обилия шаблонов и не компилирует по полчаса


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: niXman от Апрель 07, 2010, 19:36
самый весомый аргумент ;D
intel 80386 ? ;)


Название: Re: QFile::copy - проблема с русскими именами в файлах и директориях..
Отправлено: Пантер от Апрель 08, 2010, 06:19
niXman, тебе не кажется, что вопрос был совсем о другом?