#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 Можете ли вы отметить этот ответ как решение, если он работает для вас?