.net - Simple C # -programmet virker ikke korrekt, fungerer fint, når det kører fra Visual Studio

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er ny til C # og VS, og jeg har et bizarre problem.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ExampleApplication {
    class Program {
        static void Main(string[] args) {
            FileInfo fi = new FileInfo("C:\TEST.TXT");
            fi.Create();
            Console.WriteLine("File exists: {0}", fi.Exists);
        }
    }
}


Dette er mit program, det opretter en fil TEST.TXT. Når jeg kører programmet inde i VS 2010 med Debug -> Start Debugging kommandoen (F5), fungerer programmet fint, og filen oprettes.


Men hvis jeg bygger løsningen så kør programmet fra .exe ved hjælp af cmd prompt:


C:...Visual Studio 2010ProjectsExampleApplicationExampleApplicationinDebugExampleApplication.exe


Den løber ud: Filen eksisterer: sand . Men filen er ikke oprettet. Nogen har nogen ideer?


Tak

Bedste reference


Måske blev filstrøm til sidst ikke udgivet af OS, så filsystemet afspejler ikke de seneste ændringer? Prøv kun at lukke en ny fil stream eksplicit efter oprettelsen:


FileInfo fi = new FileInfo("C:\TEST.TXT");
using (var stream = fi.Create());


Lad os vide, om det virker eller ej, da det er en smule gal ide;) Jeg tror, ​​at problemet kunne være lige så enkelt

Andre referencer 1


Jeg formoder, at brugerkontokontrol omdirigerer filen oprettelse til skygge kopi mappen; under VS du kører som administrator, så filoprettelsen omdirigeres ikke.


Se efter filen i VirtualStore-biblioteket. Det vil være på


C:UsersYourUserNameHereAppDataLocalVirtualStore


Den egentlige mappe vil være noget lignende


C:UsersYourUserNameHereAppDataLocalVirtualStoreC


For at løse dette problem kan du ændre programmet, så det skriver filen til et sted beregnet til brugerdata; et indlysende valg ville være mappen Documents. Du kan også køre programmet med administratorrettigheder. Der er mindst tre måder at gøre dette på:



  • Højreklik på den eksekverbare og vælg 'Kør som administrator'

  • Kør den eksekverbare med en genvej efter afkrydsningsfeltet 'Kør som administrator' i genvejs egenskabsdialog

  • Brug enten ovenstående metode til at åbne en 'Administrator' kommandoprompt session; Kør derefter applikationen normalt ved at indtaste navnet på kommandoprompten.


Andre referencer 2


Kan være et tilladelsesproblem. Hvis brugerkontoen, der kører vS, er forskellig fra den, der kører kommandoprompten, kan de have forskellige tilladelser til oprettelse af filer. Se i din Windows-eventvisningsviser for at se, om fejlen rapporteres der. Brug derefter try-catch, som Marc foreslog.

Andre referencer 3


Bare et tip. Når du arbejder med filer, skal du altid gøre det i en prøvefangst. Du ved aldrig, hvad der kunne ske i din sag.


Kører du cmd som administrator? Måske har du ikke ret til at oprette filen.


Tilføj også et forsøg på at fange og returnere fejlen i konsollen. Det ville hjælpe dig med at finde ud af dit problem, hvis du kører som administrator, fungerer det ikke.


        try
        {            
            your code..
        }

        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }

Andre referencer 4


Du skal ringe fi.Refresh (); For at få FileSystemInfo til at undersøge basisobjektet, ellers vil det altid vende tilbage.

Andre referencer 5


Prøv at lukke filen som følger:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ExampleApplication {
    class Program {
        static void Main(string[] args) {
            FileInfo fi = new FileInfo("C:\TEST.TXT");
            fi.Create();
            fi.Close();
            Console.WriteLine("File exists: {0}", fi.Exists);
        }
    }
}

Andre referencer 6


Jeg ved ikke grunden til dette, men hvorfor vandt du det her:


if(!File.Exists("C:\TEST.TXT"))
{
   File.Create("C:\TEST.TXT");
   Console.WriteLine("File exists");
}

Andre referencer 7


Du gør dette på den forkerte måde. Du skal bortkaste filobjektet, når du er færdig med det. For at oprette en tom fil i .NET foreslår jeg at du gør det sådan:


using (File.Create("C:\TEST.TXT"));


eller sådan:


File.Create("C:\TEST.TXT").Dispose();


Alternativt kan du bare ændre din fi.Create() til:


fi.Create().Dispose();


Det er sandsynligt, at Visual Studio Debugger automatisk rydder dit rod til dig ved korrekt bortskaffelse af alle objekter, når du stopper fejlfinding.

Andre referencer 8


use the following code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ExampleApplication {
    class Program {
        static void Main(string[] args) {
         if(!File.Exists("C:\TEST.TXT"))
         {
             GC.Collect();
             GC.WaitForPendingFinalizers();
             fi.Create();
             fi.Close();
             Console.WriteLine("File exists: {0}", fi.Exists);
        }
      }
    }
}

Andre referencer 9


Dette er en simpel løsning,


Jeg kørte dig kode og fik en UnauthorizedAccessException, som er en sikkerheds undtagelse
du har ikke den rigtige sikkerhed for at gemme en fil i rodmappen (C: \)


hvis du ændrer det til FileInfo ('TEXT.TXT'); i stedet for C: \ TEXT.TXT
det vil fungere


Btw, du kan ikke bruge en brugserklæring, da FileInfo ikke implementerer IDisposable interface.