Pergunta
Existe outra maneira de converter QFile em File?Diferente disso:
QFile myFile("goforward.raw");
int FileDescriptor = myFile.handle();
FILE* fh = fdopen(FileDescriptor, "rb");
Solução
Acho que você já sabe que tem vários open
, read
, etc.métodos em QFile.Dito isto, se o arquivo não for aberto, então o handle
método retorna um erro.
QFile myFile("goforward.raw");
myFile.open(QIODevice::ReadOnly);
int fileHandle = myFile.handle();
Depois disso, você pode reabri-lo com:
FILE* fh = fdopen(fileHandle, "rb");
Outras dicas
Tivemos problemas muito estranhos com nosso aplicativo e finalmente atribuímos isso ao problema QFile/fdopen:
void foo(QString filename)
{
QFile qf(filename);
qf.open(QIODevice::ReadOnly);
int fd = qf.handle();
FILE* f = fdopen(fd, "rb");
// do some stuff with f
fclose(f); // !!! undefined behaviour !!!
}
O problema com este código é que fclose(f) é chamado antes do objeto QFile ser destruído, que é a ordem errada: QTBUG-20372
...então destrua o objeto QFile antes de chamar fclose() ou duplique o descritor de arquivo retornado por QFile::handle():
void foo(QString filename)
{
QFile qf(filename);
qf.open(QIODevice::ReadOnly);
int fd = qf.handle();
FILE* f = fdopen(dup(fd), "rb"); // !!! use dup()
// do some stuff with f
fclose(f); // correct
}
P.S.:Esses problemas estranhos com nosso aplicativo apareceram apenas em poucos sistemas devido a um atraso de 10 segundos entre uma instrução de retorno no final de uma função e o retorno real dessa função.Foi muito estranho.Então este é um exemplo de um “comportamento indefinido” manifestado no mundo real :o)
Se você tem o nome do arquivo, por que simplesmente não usa
QFile *file = fopen(filename.toLocal8Bit().data(), "rb");
?
Não é muito mais simples do que criar o QFile, abri-lo, recuperar o identificador, etc.?
E é bastante livre de bugs...