Fájl átnevezés probléma QThread-del

Fórumok

Fájlokat töltök fel egy adott helyre, amit külön thread-ek végeznek el.
A problémám az, hogy miután feltöltöttem a fájlt, át kéne helyeznem egy másik mappába, viszont a thread utána nem tudom átnevezni-áthelyezni.
Hogyan lehet "felszabadítani" a fájlt, hogy módosítható legyen?
(próbáltam úgy is, hogy QFile pointerként hoztam létre, majd delete-tel felszabadítotam a feltöltés után, de akkor sem engedte átnevezni)

void mythread::run()
{
QFile f(filename);
...
// fájlfeltöltés...
...
moveFile(filename);
}


void mythread::moveFile(const QString &fn)
{
if(!QFile::rename(fn, newname))
QMessageBox::information(0, "Error" , "Couldn't rename file: \n" + fn);
}

Hozzászólások

Rájöttem valamire, amit nagyon-nagyon nem értek.
Eddig a fájlt úgy akartam áthelyezni, hogy a fájl eredeti nevét megtartottam, csak mögé raktam egy timestampet, tehát mondjuk:
c:/Files/file.pdf -ről akartam
c:/Files/Done/file_20100510-132423.pdf -re és így volt a hiba ami miatt írtam, VISZONT ha
c:/Files/Done/file__20100510-132423.pdf -re (tehát az eredeti fájlnév és a timestamp közé kettő darab _ kerül) nevezem át, akkor meg simán megcsinálja. Logikus ez?
(nem QTemporaryFile-t használtam, hanem simán ahogyan eddig is volt)

nem tudom hogy bug-e, ugyanis amíg a main thread-ben csináltam, addig teljesen jól működött, de mivel többszálúra átírtam a fájlfeltöltést (ugyanazt a kódot használva) külön a szálakban már nem ment az átnevezés (csak ahogy írtam, hogy beleraktam egy plusz karaktert)
mindenesetre furcsa

A QFile-ra azt írja, hogy:
"All functions in this class are reentrant, except for setEncodingFunction() and setDecodingFunction(), which are nonreentrant."

Azaz ha minden thread saját fájlon dolgozik, akkor működnie kéne.

Viszont ez amit állítasz annyira fura, hogy nem tudom elképzelni, hogy Qt bug lenne. Vagy ha az, akkor a '_' csak látszólag lényeges, de valami egész más van a háttérben.

Nem lehet, hogy egy '_'-sal már voltak fájlok egy előző futtatásból és az kavar be?

Szerk:
A kódrészleted így ahogy most van biztos rossz, mert a QFile még él, mikor megpróbálod átnevezni. Legalább egy close kéne elé. De gondolom már rég nem így működik. (Bár ahogy a Qt forrást nézem nem biztos, hogy ez gond, de jobb a békesség.)

A moveFile fv-ed helyett használd a f.rename(newName) fv-t (azaz ne a statikus változatot, hanem a tagfv-t). Ilyenkor f.errorString()-gel le tudod kérdezni a hibát.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Természetesen van close(), error stringet is írattam már ki: Unknown Error volt.
Egyébként a '_' az nincs lekorlátozva '_'-ra, ahelyett bármit írhatok.
Észrevétel (amit eddig nem próbáltam) hogy úgy is működik, ha a fájlnév és a timestamp közé semmit nem írok. Tehát
c:/Files/file_20100510-132423.pdf -ről példák, ahol _ helyére bármilyen karaktert írhatok.:
c:/Files/Done/file_20100510-132423.pdf - ERROR
c:/Files/Done/file__20100510-132423.pdf - OK
c:/Files/Done/file20100510-132423.pdf - OK