2013-08-26 8 views
8

Bir dosyayı bir klasörden (örneğin Sürücü C'de) C++ 'daki başka bir klasöre (örneğin Drive D'de) taşımak istiyorum. Dosya hedef klasörde zaten mevcutsa, bunun üzerine yazılmalıdır. C++ std kütüphaneleri veya Qt ile nasıl elde edebilirim?Qt C++: Bir dosya, kaynak ve hedef yollarının taşınması farklı sürücülerde bulunuyor

"Yeniden adlandır" yöntemini buldum, ancak yolları farklı sürücülerdeyse çalışacağından emin değilim. Üstelik platform bağımlılığı nedir?

+0

Cevabım işe yarıyor mu? :) –

+0

Qt doc diyor ki "(bool QFile :: rename (const QString & newName)) Yeniden adlandırma işlemi başarısız olursa, Qt bu dosyanın içeriğini newName'e kopyalamaya çalışır ve bu dosyayı yalnızca newName'i kullanmaya devam eder." Sürücüler farklıysa çalışmalıyım. – Kunal

cevap

5

Yalnızca QFile::rename() numaralı telefonu kullanın. Çoğu amaç için yaklaşık doğru olanı yapmalıdır. C++ standart kütüphanesi, dosya sistemi yeniden adlandırılmış bir aramaya sahip değil (lütfen yanılıyorsam yorumlarda beni düzeltin!), std::rename sadece tek dosya sisteminde hareket edebilir. Ancak, buradaki tek (ilgili) atomik dosya işlemi, dosya içeriğine dokunulmadığında aynı dosya sisteminde yeniden adlandırılır, sadece dizin bilgileri değişir. Bunun destekleyen bir C++ kütüphanesinin farkında değilim, işte kaba pseudocode var: Bu garanti gibi

if basic rename succeeds 
    you're done 
else if not moving between file systems (or just folders for simplicity) 
    rename failed 
else 
    try 
    create temporary file name on target file system using a proper system call 
    copy contents of the file to the temporary file 
    rename temporary file to new name, possibly overwriting old file 
    remove original file 
    catch error 
    remove temporary file if it exists 
    rename failed 

de genişlemiş, bütün bir dosya seferde yeni konum göründüğünü de o dosya ve en kötü hasar tipleri kopyalama dahil dosya taşımak yerine.

+1

Windows sürücü harfleri göz önüne alındığında, [MSDN] (http://msdn.microsoft.com/en-us/library/zw5t957f.aspx) adresine ertelemek akıllıca olabilir: "Yeni adın adı bir varolan dosya veya dizin: 'newname' argümanında farklı bir yol vererek bir dosyayı bir [...] aygıttan diğerine taşımak için' rename' kullanabilirsiniz.Ancak bir dizini taşımak için 'rename' kullanamazsınız. " – MSalters

+0

Sadece meraktan, hedef dizin takılı bir sürücüde oturuyorsa işe yarayacak mı? Bunu doğrulamak için kaynak yok :(. –

+0

@nik_kgp Biraz araştırma yaptıktan sonra, Windows üzerinde atomik dosya işlemleri oldukça karmaşık (veya özellikle Vista'dan önceki Windows sürümlerinde) imkansız gibi görünüyor. Posix'den daha fazlası: Genel çözüm, bunun için endişelenmemek, sadece hataları kontrol etmek ve uygun şekilde raporlamaktır.Bazı dosya sistemi durumuna güvenmek, başka bir program aynı zamanda değiştirebileceğinden, yine de kötü bir fikirdir. Kullanıcı istediği zaman (ya da harici sürücü durumunda, kabloyu dışarı atmak) istediği zaman kaldıramazdı. Yani sadece 'QFile :: rename' kullanın ve dönüş kodunu kontrol edin. – hyde

İlgili konular