• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd przy uruchamianiu pliku exe z kodu.

Object Storage Arubacloud
+2 głosów
785 wizyt
pytanie zadane 20 kwietnia 2021 w C# przez WeekendSolider Nowicjusz (140 p.)

Witam. Piszę mały skrypt do backupów zapisów gry z Spacebase DF9 i mam problem. Chcę aby skrypt uruchamiał plik exe z grą, czekać minutę, potem ma wykrywać czy proces Space.exe jest w pamięci a następnie co jakiś czas robić kopię pliku zapisu gry. Muszę jakoś wydobyć zmienną w której jest zapisana nazwa akutalnego usera i ją wkleić do zmiennej typu string o nazwie saveFile. Największy problem jednak jest w Process.Start(startInfo) bo pomimo poprawnego podania ścieżki wywala mi błąd:

An unhandled exception of type 'System.ComponentModel.Win32Exception' occurred in System.dll
Additional information: Nie można odnaleźć określonego pliku

using System;
using System.Diagnostics;
using System.Linq;
using Binarysharp.MemoryManagement;

namespace SpacebaseDF9AutoSaveBackupCSharp
{
	class Program
	{
		static void Main(string[] args)
		{
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = @"C:\Program Files(x86)\Steam\steamapps\common\SpacebaseDF9\Win\Bin\Space.exe";
            Process.Start(startInfo);
            try
            {
                var process = new MemorySharp(Process.GetProcessesByName("Space").FirstOrDefault());
                Console.WriteLine($"Game is runing with PID: {process.Pid.ToString()}");
                Environment.GetEnvironmentVariable("userprofile");
                string saveFile = "C:\\Users\\%nazwa_użytkownika%\\Documents\\SpacebaseDF9\\Saves\\SpacebaseDF9AutoSave.sav";

            }
            catch (NullReferenceException)
            {
                Console.WriteLine("Game is not runing.");
            }

        }
	}
}

 

1 odpowiedź

+1 głos
odpowiedź 21 kwietnia 2021 przez VBService Ekspert (253,340 p.)
edycja 21 kwietnia 2021 przez VBService

Zobacz co dokładnie zawiera %userprofile%.

i ten kawałek

Environment.GetEnvironmentVariable("userprofile");
string saveFile = "C:\\Users\\%nazwa_użytkownika%\\Documents\\SpacebaseDF9\\Saves\\SpacebaseDF9AutoSave.sav";

zamień na np.:

using System.IO; // DODAJ

. . .

string userprofile = Environment.GetEnvironmentVariable("userprofile");
string saveFile = Path.Combine(userprofile, "Documents\\SpacebaseDF9\\Saves\\SpacebaseDF9AutoSave.sav");

 

wink

string userprofile = Environment.GetEnvironmentVariable("userprofile");
Process.Start(Path.Combine(userprofile, "Documents"));

 

Path.Combine Method ]

komentarz 21 kwietnia 2021 przez WeekendSolider Nowicjusz (140 p.)
edycja 21 kwietnia 2021 przez WeekendSolider
Ok dziękuję.

Jeszcze tylko muszę rozwiązać zagadkę z tym błędem nie znalezienia określonego pliku. Plik exe istnieje w danej lokacji oraz wykluczyłem złą architekturę (jak architektura pliku exe i pisanego programu się nie zgadzają to wychodzi taki błąd https://stackoverflow.com/questions/27596215/c-sharp-code-wont-launch-programs-win32exception-was-unhandled).

Szukam rozwiązań i wszędzie jest napisane tak jak ja zrobiłem więc dlaczego nie jest dobrze?
komentarz 21 kwietnia 2021 przez VBService Ekspert (253,340 p.)

Może zrób skrót na pulpicie do tego programu (C:\Program Files(x86)\Steam\steamapps\common\SpacebaseDF9\Win\Bin\Space.exe) i ...


. . .

ProcessStartInfo startInfo = new ProcessStartInfo();
string userprofile = Environment.GetEnvironmentVariable("userprofile");
startInfo.FileName = Path.Combine(userprofile, "Desktop", "Space.lnk");
Process.Start(startInfo);

. . .

 

komentarz 21 kwietnia 2021 przez WeekendSolider Nowicjusz (140 p.)
Niestety zmiana z pliku exe na skrót do niego nic nie zmieniła.
1
komentarz 21 kwietnia 2021 przez WeekendSolider Nowicjusz (140 p.)
edycja 21 kwietnia 2021 przez WeekendSolider

Mówiąc "zmiana z pliku exe na skrót" miałem na myśli właśnie uruchomienie przez ten skrót.

Próbowałem też tego:

Process.Start("C:\\Program Files(x86)\\Steam\\steamapps\\common\\SpacebaseDF9\\Win\\Bin\\Space.exe");

To samo wychodzi angry

komentarz 21 kwietnia 2021 przez WeekendSolider Nowicjusz (140 p.)
OK głupotę zrobiłem. Jakimś cudem między Files i (x86) nie było spacji. Teraz muszę ogarnąć jak sprawdzić czy plik exe działa.
komentarz 21 kwietnia 2021 przez WeekendSolider Nowicjusz (140 p.)

Ok teraz problem jest inny. Kod wygląda tak:

using System;
using System.Diagnostics;
using System.Linq;
using System.IO;

namespace SpacebaseDF9AutoSaveBackupCSharp
{
	class Program
	{
		static void Main()
		{
            ProcessStartInfo startInfo = new();
            startInfo.FileName = @"C:\Program Files (x86)\Steam\steamapps\common\SpacebaseDF9\Win\Bin\Space.exe";
            startInfo.Arguments = "";
            startInfo.UseShellExecute = true;
            startInfo.RedirectStandardOutput = false;
            Process.Start(startInfo);
            string userprofile = Environment.GetEnvironmentVariable("userprofile");
            //Process.Start("C:\\Program Files (x86)\\Steam\\steamapps\\common\\SpacebaseDF9\\Win\\Bin\\Space.exe");
            Process[] processes = Process.GetProcessesByName("Space.exe");
            Console.WriteLine("{0} Game processes", processes.Length);
            try
            {
                bool isRunning = Process.GetProcessesByName("Space")
                 .FirstOrDefault(p => p.MainModule.FileName.StartsWith(@"c:\Program Files (x86)\Steam\steamapps\common\SpacebaseDF9\Win\Bin\")) != default(Process);
                string saveFile = Path.Combine(userprofile, "\\Documents\\SpacebaseDF9\\Saves\\SpacebaseDF9AutoSave.sav");
                System.Threading.Thread.Sleep(90000);
                if (File.Exists(saveFile)) 
                {
                    while (isRunning == true)
					{
                        for (int i = 0; i <= 5; i++)
						{
                            string number = i.ToString();
                            File.Copy(saveFile, Path.Combine(saveFile, number), true);
						}
					}
                }
                else
				{
                    Console.WriteLine("Save file does not exists, aborting");
                    
				}

            }
            catch (NullReferenceException)
            {
                Console.WriteLine("Game is not runing.");
            }
        }
	}
}

I program się nie odpala choć przechodzi przez Process.Start(startInfo);

Między zmienną userprofile a try dałem zmieną dającą na konsolę liczbę procesów o tej nazwie i powinna wynosić 1 a jest zero. Coś jest nie tak bo dla sprawdzenia tymczasowo podmieniłem pod plik exe Steam'a i wykonuje ten plik exe bez problemu.

Podobne pytania

0 głosów
0 odpowiedzi 172 wizyt
0 głosów
1 odpowiedź 323 wizyt
pytanie zadane 12 czerwca 2019 w C# przez DobryKurczak Bywalec (2,320 p.)
0 głosów
2 odpowiedzi 296 wizyt
pytanie zadane 31 października 2018 w C# przez Antero00 Gaduła (3,670 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...