Tôi đang chuyển ứng dụng Unix C sang Windows. Ứng dụng này đổi tên các tập tin trong khi chúng được mở, đó là hoàn toàn tốt đẹp trên Unix nhưng dường như nó không hoạt động trên Windows. Truy tìm tất cả các tên gọi để chắc chắn rằng tôi đóng tập tin, sau đó mở lại và tìm kiếm lại sẽ rất đau đớn.Lập trình đổi tên tệp mở trên Windows
Cho rằng Windows Explorer cho phép đổi tên tệp trong khi đang sử dụng, tôi tự hỏi tại sao tôi không thể làm việc này. Tôi đã thử với rename và MoveFile trong C và System.IO.File.Move trong C#. Nó không thành công trong tất cả các trường hợp với lỗi "Quyền bị từ chối" (cụ thể, lỗi được trả về bởi GetLastError() là "Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một tiến trình khác")
Mẹo?
Tôi cũng đã cố mở tệp để chia sẻ với _sopen. Nó không hoạt động (cùng một lỗi).
Working C# code nhờ Stefan:
string orig_filename = "testrenamesharp-123456";
string dest_filename = "fancynewname.txt";
Byte[] info = new UTF8Encoding(true).GetBytes("This is to test the OpenWrite method.");
var fs = new FileStream(orig_filename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
fs.Write(info, 0, info.Length);
File.Move(orig_filename, dest_filename);
fs.Close();
Working C mẫu:
const char* filename = "testrename-XXXXXX";
const char* dest_filename = "fancynewname.txt";
/* The normal POSIX C functions lock the file */
/* int fd = open(filename, O_RDWR | O_CREAT, _S_IREAD | _S_IWRITE); */ /* Fails */
/* int fd = _sopen(filename, O_RDWR | O_CREAT, _SH_DENYNO, _S_IREAD | _S_IWRITE); */ /* Also fails */
/* We need to use WINAPI + _open_osfhandle to be able to use
file descriptors (instead of WINAPI handles) */
HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
if(INVALID_HANDLE_VALUE == hFile) {
ErrorExit(TEXT("CreateFile"));
}
int fd = _open_osfhandle((long int)hFile, _O_CREAT | _O_RDWR | _O_TEMPORARY);
if(-1 == fd) {
perror("open");
}
int resw = write(fd, buf, strlen(buf));
if(-1 == resw) {
perror("write");
}
if(0 == access(dest_filename, F_OK)) {
perror("access");
}
/* Now try to rename it - On Windows, this fails */
int resr = rename(filename, dest_filename);
if(-1 == resr) {
perror("rename");
}
int resc = close(fd);
if(-1 == resc) {
perror("close");
}
bạn đang gặp phải những sự cố gì? – StevenV
Quyền bị từ chối. – pgquiles
Windows explorer cho phép đổi tên tệp (bị khóa) trong khi đang sử dụng? Kể từ khi? –