Система.Процесс ComponentModel.Win32Exception.Запустить

#c# #.net-core

#c# #.net-ядро

Вопрос:

Я работаю над проектом, который использует API веб-сайта для выполнения задач. Он сохраняет данные в текстовом файле, и я хочу, чтобы он открыл файл в конце программы. Я использую System.Диагностика.Процесс.Запуск (myFile), но он выдает исключение:

 Unhandled exception. System.ComponentModel.Win32Exception (13): Permission denied
   at System.Diagnostics.Process.ForkAndExecProcess(String filename, String[] argv, String[] envp, String cwd, Boolean redirectStdin, Boolean redirectStdout, Boolean redirectStderr, Boolean setCredentials, UInt32 userId, UInt32 groupId, UInt32[] groups, Int32amp; stdinFd, Int32amp; stdoutFd, Int32amp; stderrFd, Boolean usesTerminal, Boolean throwOnNoExec)
   at System.Diagnostics.Process.StartCore(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)
   at ESEL_Scraper_2._0.Program.Main(String[] args) in /home/af2111/Schreibtisch/Coding/C#/ESEL Scraper 2.0/Program.cs:line 72
  

Мой код:

 using System;
using System.Linq;
using System.Diagnostics;
using System.Threading;
using System.Net;
using System.IO;
using Newtonsoft.Json;
namespace ESEL_Scraper_2._0
{
    
    class MyJsonType
    {
        public string title { get; set; }

        public string tags {get; set;}

        public string category {get; set;}

        public string location {get; set;}

        public int id { get; set; }

        public string startdatetime {get; set;}

    }
    class Root { public MyJsonType[] termine { get; set; } }
    class Program
    {
        static void Main(string[] args)
        {
            int queryResults = 0;
            Console.WriteLine("How many days do you want to go back?");
            String userInput = Console.ReadLine();
            int result = Int32.Parse(userInput);
            Console.WriteLine("What do you want to search for?");
            String userInput2 = Console.ReadLine();
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            for(int j = 0; j < resu< j  ) {
            DateTime somePreviousDay = DateTime.Now.Date.AddDays(-j);
            String somePreviousDayString = somePreviousDay.ToString("dd.MM.yyyy");
            Console.WriteLine(somePreviousDayString);
            WebClient client = new WebClient();
            client.Encoding = System.Text.Encoding.UTF8;
            string site = client.DownloadString($"https://esel.at/api/termine/data?date={somePreviousDayString}amp;selection=false");
            var myJsonObject = JsonConvert.DeserializeObject<Root>(site);
            for(int i = 0; i < myJsonObject.termine.Length; i  ) {
                if(myJsonObject.termine[i].tags.Contains(userInput2) || myJsonObject.termine[i].title.Contains(userInput2) || myJsonObject.termine[i].category.Contains(userInput2)){
                    using (System.IO.StreamWriter file =
                   new System.IO.StreamWriter(@"eselData.txt", true))
                    {
                    file.WriteLine($"Titel: {myJsonObject.termine[i].title}; Tags: {myJsonObject.termine[i].tags}; Datum und Zeit: {myJsonObject.termine[i].startdatetime}; Location: {myJsonObject.termine[i].location}; Kategorie: {myJsonObject.termine[i].category}");
                    }
                    queryResults  ;
                }
                
            }
            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);     
            Console.WriteLine($"Time taken: "   elapsedTime); 
            Console.WriteLine($"Found tags: "   queryResults); 
            
            if(queryResults > 0) {
               using (System.IO.StreamWriter file =
                   new System.IO.StreamWriter(@"eselStats.txt", true))
                    {
                    file.WriteLine($"{userInput2}: {queryResults} Ergebnisse.");
                    System.Diagnostics.Process.Start("eselData.txt");
                    }    
            }


        }
    }
}
  

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

Комментарии:

1. Access Denied если путь указан правильно, то у вас, вероятно, нет разрешения на этот путь, для тестирования повторно запустите Visual Studio в режиме администратора и проверьте его еще раз.

2. Я использую vs code в Linux, должен ли я просто запустить sudo dotnet?

Ответ №1:

Системы Linux показывают Permission denied , когда вы пытаетесь выполнить файл, который не является исполняемым. Я не думаю, что вы хотите выполнить текстовый файл. Вы скорее хотите открыть его с помощью текстового редактора по умолчанию.

Я не уверен, работает ли это на всех системах Linux, но, по крайней мере, в Windows вы достигаете этого, установив ProcessStartInfo.UseShellExecute значение true . По умолчанию он отключен в .NET Core. Смотрите документацию Microsoft.

Пример кода:

 var startInfo = new ProcessStartInfo("eselData.txt")
{
    UseShellExecute = true
};
Process.Start(startInfo);
  

Комментарии:

1. @af2111 Можете ли вы отметить этот ответ как решение, если он работает для вас?