"Tên tệp hoán đổi" có nghĩa là gì? Bạn đang nói về hệ thống tập tin, hay chỉ là các biến trong chương trình của bạn?
Nếu chương trình của bạn là C++ và bạn có hai tên tệp trong chuỗi và muốn trao đổi chúng, hãy sử dụng std :: swap.Điều này chỉ thay đổi các biến trong chương trình:
std::string filenameA("somefilename");
std::string filenameB("othername");
std::swap(filenameA, filenameB);
std::cout << filenameA << std::endl; // prints "othername"
Nếu bạn có hai tập tin trên đĩa, và bạn muốn những cái tên để trao đổi nội dung với nhau, thì không có, không có cách nào để dễ dàng vào đó, nếu bạn muốn giữ liên kết cứng. Nếu bạn chỉ muốn thực hiện "lưu an toàn" thì lệnh gọi hệ thống unix rename() sẽ ghi đè tệp đích bằng tệp nguồn trong một hoạt động nguyên tử (như nguyên tử có thể được hệ thống tệp cơ bản hỗ trợ). Do đó, bạn sẽ an toàn lưu như sau:
std::string savename(filename);
savename += ".tmp";
... write data to savename ...
if (::rename(savename.c_str(), filename.c_str()) < 0) {
throw std::exception("oops!");
}
Nếu bạn thực sự cần trao đổi tệp trên đĩa (để giữ bản sao lưu), hãy nhập liên kết cứng. Lưu ý: liên kết cứng không được hỗ trợ trên tất cả các hệ thống tệp (cụ thể là một số chia sẻ tệp SMB), vì vậy bạn cần triển khai một số bản sao lưu nếu cần. Bạn sẽ cần một tệp tạm thời tên, nhưng không cần bất kỳ kho lưu trữ dữ liệu tạm thời nào. Trong khi bạn có thể thực hiện nó bằng tay với liên kết() và bỏ liên kết() (nhớ: các tập tin có thể có nhiều liên kết cứng trong UNIX), nó dễ dàng hơn chỉ bằng cách sử dụng rename(). Tuy nhiên, bạn không thể hoán đổi một cách nguyên tử.
giả oldfile là "filname.dat" và newFile là "filename.dat.bak" bạn sẽ có được điều này:
::link(oldfile, tempfile);
::rename(newfile, oldfile);
::rename(tempfile, newfile);
Nếu bạn sụp đổ sau khi liên kết, bạn sẽ có dữ liệu mới trong newfile, và dữ liệu cũ trong oldfile và tempfile. Nếu bạn sụp đổ sau khi đổi tên đầu tiên, bạn sẽ có dữ liệu mới trong oldfile, và các dữ liệu cũ trong tempfile (nhưng không newFile!)
Ý anh là gì bằng cách trao đổi tên tập tin? Đổi tên tệp "A" thành "B" và v.v.? – Kimvais
Không có chức năng tích hợp cho JUST hoán đổi tên tập tin! như bạn đã nói, bạn có thể làm điều đó bằng một kịch bản lệnh shell và biến tạm thời –
Bạn có một ngôn ngữ triển khai cụ thể hay bạn cần một lệnh (shell)? Loại phân vùng nào đang được sử dụng? (Không làm việc trên NFS cần phải được xem xét?) Có gì sai với các approp biến tạm thời? –