c # - Fil omdirigering fra Programdata til AppData \ Local \ VirtualStore \ ProgramData

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger C # med .net 3.5


Jeg gemmer mine programdata i en fil under: C: \ Programdata \ MyProgramName \ fileName.xml


Efter installation og kørsel af min ansøgning en gang jeg afinstallerede den (under afinstallation fjerner jeg alle filerne fra 'programdata')
og så geninstallerer jeg programmet og kørte det.


Det mærkelige er, at min ansøgning startede som om filerne i programdata eksisterede - betyder, at jeg havde gamle data i min app, selvom datafilen blev slettet.


Når du kører:


File.Exists("C:Program DataMyProgramNamefileName.xml")


Jeg fik 'sand', selvom jeg vidste, at filen ikke eksisterede.


Sagen blev fremmed, da jeg kørte applikationen som admin, og da eksisterede filen ikke.


Efter en undersøgelse fandt jeg ud af, at når jeg kører min applikation uden admin privilegier i stedet for at få: 'C: \ Programdata \ MyProgramName \ fileName.xml' Jeg får 'C: \ Users \ userName \ AppData \ Local \ VirtualStore \ ProgramData \ MyProgramName \ fileName.xml'


og der var faktisk en fil, der eksisterede fra den tidligere installation (som jeg selvfølgelig ikke slette, fordi jeg ikke vidste det eksisterede).


Så tydeligvis er der en vis virtuel sti til filen under programdata.


EDIT:


Jeg fandt ud af at efter at have slettet den gamle fil i den virtuelle butik, er min ansøgning pludselig i stand til at finde den rigtige fil. (Jeg lavede ingen ændringer i filen under Programdata.


Mit spørgsmål er:



  1. hvorfor er det sket.

  2. Hvordan kan jeg forhindre det i at ske



Tak på forhånd

Bedste reference


Er du faktisk nødt til at skrive til mappen Programdata-data pr. System i stedet for mappen (e) for brugerdata (Application Data)?


Du vil muligvis gerne se på Environment.GetFolderPath og følgende Environment.SpecialFolder s: [10] [11]



  • Environment.SpecialFolder.ApplicationData - data mappe til applikationsdata, synkroniseret på domænecontroller, hvis brugerprofilen roaming

  • Environment.SpecialFolder.LocalApplicationData - data mappe til applikationsdata, lokal og ikke synkroniseret (nyttig til for eksempel caches)



EDIT:


Testet på Windows 7 x64, ikke-administratorbruger.


var appData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
var myFolder = Path.Combine(appData, "MyApp");
if(!Directory.Exists(myFolder)) Directory.CreateDirectory(myFolder);
File.WriteAllText(Path.Combine(myFolder, "Test.txt"), "Test.");


Dette gør hvad der forventes, dvs. skriver ind i C:ProgramDataMyAppTest.txt. Så vidt jeg kan fortælle (Administrator mode Command Prompt), er der heller ingen UAC virtualisering på.


Dobbelt redigering:


Jeg antager, hvad der er sket, at en administratorbruger på et tidspunkt har skrevet filerne til din ProgramData-mappe, og som sådan sparker UAC-filsystemvirtualisering i og omdirigerer den ikke-administrator skriver ind i VirtualStore.


Kører din afinstallerer som administrator? Hvis det gør det, skal du muligvis kontrollere både VirtualStore -banen for den bruger, der starter afinstallationen, og den faktiske filsystemsti for programdata, der skal fjernes. Jeg er ikke sikker på, om der er en officiel måde at gøre dette på, selvom ...

Andre referencer 1


Jeg fandt årsagen til fejlen.


applikationen forsøger at tage ejerskab på filen, og derefter oprettes den anden fil.


Jeg fjernede den linje, og nu fungerer alt fint.