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

 ( rolanddd | 2010. május 10., hétfő - 16:37 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

QTemporaryFile nem megoldás?

Statikus függvény:
QTemporaryFile * createLocalFile( const QString & fileName )
--
http://www.naszta.hu

opsz, mégsem megy, előbb azt hittem már jó, írtam is hogy kész, aztán megint hiba :/

Töltsd a cuccot temporary fájlba, azt másold a célhelyre static bool QFile::copy( const QString & fileName, const QString & newName )-val, majd temporary fájl objektumot töröld. Szerintem.
--
http://www.naszta.hu

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)

2 megoldás lehet:

1) találtál egy alattomos bug-ot (küld el a Nokia-nak, javítsák),
2) a hiba sokadszori javítása közben kijavítottad a tényleges hibát egy fura tünet reprodukálása mellett, és extrapolálsz. Velem is előfordult ez. :)
--
http://www.naszta.hu

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

Most vedd ki a plusz karaktert és nézd meg úgy. A lényeg, hogy biztosan ne változtass mást...

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

nem egyszer próbáltam (de a kedvedért mégegyszer meggyőzödtem róla) :) ezért is írtam hogy mennyire érthetetlen számomra a jelenség

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

OS, fordító, Qt verzió?

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

Qt 4.6.1
Windows 7 x86

szerk.: elmaradt a fordító: MinGW