Nano Hash - криптовалюты, майнинг, программирование

Простое приложение C# работает неправильно, отлично работает при запуске из Visual Studio

Я новичок в 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

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

Спасибо


  • Вероятно, это проблема с правами. Попробуйте запустить свой exe с правами администратора и посмотрите, работает ли это. 12.03.2012
  • Вы уверены, что его не существует? Строка fi.Create() явно создает файл. 12.03.2012
  • Файла точно нет. Когда я запускаю его из VS, он создается нормально. Я запускал .exe с правами администратора, все еще не исправляется. Я изменил программу, чтобы записать больше информации, которую она теперь печатает: 12.03.2012
  • Файл существует: True Имя файла: C:\TEST.TXT Длина файла: 0, но на самом деле его там нет. Если я попытаюсь открыть его из блокнота или просто посмотрю в проводнике, его там нет. 12.03.2012
  • Пробовал на своем ПК (Win7x64 Net4) и работает как положено! Вероятно, проблема с разрешением. Вы пытались вручную создать файл в корневом каталоге (Блокнот)? 12.03.2012
  • в какой версии Windows вы это пытаетесь, если Win7 включен UAC? 12.03.2012
  • УАК выключен. Пробовал запускать от имени администратора, я могу создавать файлы в C:/нормально. Я думаю, что я собираюсь отказаться от этого вечера. Спасибо за помощь в любом случае :) 12.03.2012
  • @RickyJones: см. мой ответ ниже. 12.03.2012
  • @RickyJones UAC будет перенаправлять чтение и запись файлов, даже если он выключен. Вы проверили каталог VirtualStore? (См. мой ответ ниже для более подробной информации.) 14.03.2012

Ответы:


1

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

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

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

11.03.2012
  • @RickyJones: вы поделились точным исходным кодом, который используете? возможно, вы удалили что-то маленькое, что посчитали не важным? Пожалуйста, поделитесь точным кодом, возможно, у вас есть что-то вроде Console.ReadLine() или чего-то еще, что вы пропустили, публикуя здесь? 12.03.2012

  • 2

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

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

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

    Фактическая папка будет примерно такой

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

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

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

    3

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

    11.03.2012

    4

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

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

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

            try
            {            
                your code..
            }
    
            catch (Exception e)
            {
                Console.WriteLine("{0} Exception caught.", e);
            }
    
    11.03.2012
  • Спасибо, но никаких исключений не выбрасывается. 12.03.2012
  • Вы запускаете cmd от имени администратора? 12.03.2012

  • 5

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

    11.03.2012

    6

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

    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);
            }
        }
    }
    
    11.03.2012
  • FileInfo не предоставляет метод Close, возможно, вы имеете в виду FileStream.Close()? 12.03.2012

  • 7

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

    if(!File.Exists("C:\\TEST.TXT"))
    {
       File.Create("C:\\TEST.TXT");
       Console.WriteLine("File exists");
    }
    
    11.03.2012
  • Забавно ;) Будет напечатано File does not exists, когда файл действительно существует ;) 12.03.2012
  • вы имеете в виду, что он создал файл, но пишет «Файл не существует»? 12.03.2012
  • Просто прочитайте свой блок else, он будет работать в случае, если File.Exists("C:\\TEST.TXT") == true 12.03.2012

  • 8

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

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

    или вот так:

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

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

    fi.Create().Dispose();
    

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

    11.03.2012
  • Кроме того, прежде чем пробовать этот код, я бы посоветовал вам перезагрузить компьютер, чтобы убедиться, что Windows больше не пытается использовать то же пространство памяти. 12.03.2012

  • 9

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

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

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

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

    12.03.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..