Простое приложение на C # работает некорректно, отлично работает при запуске из Visual Studio - PullRequest
4 голосов
/ 12 марта 2012

Я новичок в C # и VS, и у меня странная проблема.

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

Это моя программа, она создает файл TEST.TXT. Когда я запускаю программу в VS 2010 с помощью команды «Отладка -> Начать отладку» (F5), программа работает нормально, и файл создается.

Однако, если я собираю решение, запустите программу из .exe, используя приглашение cmd:

C:\...\Visual Studio 2010\Projects\ExampleApplication\ExampleApplication\bin\Debug\ExampleApplication.exe

Выполняется вывод: Файл существует: true . Но файл не создан. У кого-нибудь есть идеи?

Спасибо

Ответы [ 10 ]

3 голосов
/ 12 марта 2012

Я подозреваю, что Контроль учетных записей перенаправляет создание файла в каталог теневого копирования; под VS вы работаете как администратор, поэтому создание файла не перенаправляется.

Найдите файл в каталоге VirtualStore. Это будет на

C:\Users\YourUserNameHere\AppData\Local\VirtualStore

Фактическая папка будет выглядеть примерно так:

C:\Users\YourUserNameHere\AppData\Local\VirtualStore\C

Чтобы решить эту проблему, вы можете изменить программу так, чтобы она записывала файл в место, предназначенное для пользовательских данных; очевидным выбором будет папка Documents. Вы также можете запустить приложение с правами администратора. Есть как минимум три способа сделать это:

  • Щелкните правой кнопкой мыши исполняемый файл и выберите «Запуск от имени администратора»
  • Запускать исполняемый файл с ярлыком, после установки флажка «Запуск от имени администратора» в диалоговом окне свойств ярлыка
  • Используйте любой из указанных выше способов, чтобы открыть сеанс командной строки «Администратор»; затем запустите приложение как обычно, введя его имя в командной строке.
3 голосов
/ 12 марта 2012

Возможно, файловый поток в конечном итоге не был выпущен ОС, поэтому файловая система не отражает последние изменения?Просто попробуйте явно закрыть новый файловый поток после создания:

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

Пожалуйста, дайте нам знать, работает ли он или нет, поскольку это немного сумасшедшая идея;) Я считаю, что проблема может быть даже простой

2 голосов
/ 12 марта 2012

Может быть проблема с разрешениями. Если учетная запись пользователя, на котором запущена vS, отличается от учетной записи, на которой запущена командная строка, они могут иметь разные разрешения для создания файлов. Посмотрите в вашей программе просмотра событий Windows, чтобы увидеть, если там сообщается об ошибке. Затем используйте try-catch, как предложил Марк.

1 голос
/ 12 марта 2012

Это простое решение,

Я запустил ваш код и получил исключение UnauthorizedAccessException, которое является исключением безопасности, для которого у вас нет прав безопасности для сохранения файла в корневой папке (C: \)

если вы измените его на FileInfo ("TEXT.TXT");вместо C: \ TEXT.TXT он будет работать

Кстати, вы не можете использовать оператор using, так как FileInfo не реализует интерфейс IDisposable.

1 голос
/ 12 марта 2012
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);
        }
      }
    }
}
1 голос
/ 12 марта 2012

Вы делаете это неправильно. Вы должны утилизировать объект файла после того, как с ним покончено. Чтобы создать пустой файл в .NET, я бы посоветовал вам сделать это так:

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

или как это:

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

В качестве альтернативы вы можете просто изменить fi.Create() на:

fi.Create().Dispose();

Вполне вероятно, что Visual Studio Debugger автоматически убирает за вас беспорядок, правильно удаляя все объекты, когда вы прекращаете отладку.

1 голос
/ 12 марта 2012

Попробуйте закрыть файл следующим образом:

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);
        }
    }
}
1 голос
/ 12 марта 2012

Вам нужно вызвать fi.Refresh (); чтобы FileSystemInfo повторно проверил базовый объект, в противном случае он всегда будет возвращать false.

1 голос
/ 12 марта 2012

Я не знаю причину этого, но почему бы вам не попробовать это:

if(!File.Exists("C:\\TEST.TXT"))
{
   File.Create("C:\\TEST.TXT");
   Console.WriteLine("File exists");
}
1 голос
/ 12 марта 2012

Просто совет.Когда вы работаете с файлами, всегда делайте это в попытке поймать.Вы никогда не знаете, что может произойти в вашем случае.

Вы запускаете cmd от имени администратора?Возможно, у вас нет прав для создания файла.

Также добавьте try catch и верните ошибку в консоль.Это поможет вам выяснить вашу проблему, если не работает администратор.

        try
        {            
            your code..
        }

        catch (Exception e)
        {
            Console.WriteLine("{0} Exception caught.", e);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...