c # - Programmér omdøb åben fil på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bærer en Unix C-applikation til Windows. Denne applikation omdøber filer, mens de er åbne, hvilket er helt fint på Unix, men tilsyneladende virker det ikke på Windows. Sporing af alle omnavne for at sikre, at jeg lukker filen, så genåbner og søger igen, ville være smertefuldt.


Da Windows Explorer gør det muligt at omdøbe en fil, mens den er i brug, undrer jeg mig over, hvorfor jeg ikke kan få det til at fungere. Jeg har forsøgt med omdøb og MoveFile i C, og System.IO.File.Move i C #. Det fejler under alle omstændigheder med en 'Tilladelse afvist' fejl (specifikt er fejlen returneret af GetLastError () 'Processen kan ikke få adgang til filen, fordi den bruges af en anden proces') [4] [5]


Tips?


Jeg har også forsøgt at åbne filen for at dele med \_sopen. Det virkede heller ikke (samme fejl).


Arbejde C # kode takket være 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();


Arbejde C prøve:


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");
}

Bedste reference


Omdøbning kræver, at den pågældende fil blev åbnet med FileShare.Delete deling.
Hvis det pågældende delflag mangler, kan du ikke omdøbe/flytte filen, mens den stadig er åben. [6]

Andre referencer 1


Det afhænger af, hvordan filen blev åbnet. Hvis en fil åbnes med lås, kan du ikke skrive eller omdøbe den. Værktøjer som Notepad ++ åbne filer uden at låse det. Hvis du er den der åbner og redigerer det, kan du også gøre det:


http://balajiramesh.wordpress.com/2008/07/16/using-streamreader-without-locking-the-file-in-c/[7]


Koden i artiklen viser, hvordan du bruger en FileStream med FileShare muligheder:


using(FileStream fs = new FileStream(@”c:	est.txt”, FileMode.Open, FileAccess.Read,FileShare.ReadWrite))
{
    StreamReader sr = new StreamReader(fs);
    txtContents.Text = sr.ReadToEnd();
    sr.Close();
}