Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
12 / 9 / 3
Регистрация: 08.01.2019
Сообщений: 454
1

Проблема в работе с файлами !

23.12.2019, 10:59. Просмотров 280. Ответов 7
Метки нет (Все метки)

Здравствуйте, у меня есть только work.exe(который считает функцию 2 в степени х и выводит результат в файл), который работает с аргументами командной строки. Там есть аргумент -o outPutFileName который после работы приложения записывает результат в этот файл, и если файла еще нету он его создает, при повторной работе приложение перезаписует файл, если снова указан файл с таким же именем.
И так в чем состоит моя проблема
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
try
            {
                MyArgs = "-b" + " " + blank + " " + "-f" + " " + sfile + " " + "-r" + " " + buf + " " + "-o" + " " + "1.txt";
                Process.Start(filename, MyArgs);
 
                using (StreamReader sw = new StreamReader("1.txt", false))
                {
                    string buffer2 = "";
                    int k = 0;
                    buffer2 = sw.ReadLine();
                    for (int i = 0; buffer2.Length > i; i++)
                    {
                        if (buffer2[i] == '|')
                        {
                            k++;
                        }
                    }
                    Console.WriteLine("Our result: {0} ", k);
                    sw.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
 
            }
1. Если файла нету( в данном случае 1.txt) то при запуске моего приложение a.exe -f work.exe [и пошли дальше аргументы]
work.exe создаст файл и все норм, но моя программа выдаст Exception, на что файл нету.
2. При втором запуске, если все аргументе теже моя прогрмама тоже заработает и прочитает файл и выдаст результат в консоль.
НООО если аргумент отвечающий за входные данные для расчетов, допустим в первых двух пунктах был -r 3 то и результат был 8, а теперь я введу другое число -> то первый раз мое приложение прочитает те данные с прошлого раза и выдаст 8, при втором запуске с тем же самым аргументом моя программа прочитает файл верно выдаст результат отличимый от 8, допустим что последние два раза было -r 2 то первый раз скажет 8, а второй раз прочтитае и скажет 4, что есть верно.
Изходя с этого я уверен на 99%, что я почемуто читаю файл до новой записи сделаной приложением work.exe, хоть и пишу это дело после Process.Start()

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

Добавлено через 31 минуту
Пришла в голову идея, что проблема в самом процессе.
Переписал так, но проблемы остались те же.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
MyArgs = "-b" + " " + blank + " " + "-f" + " " + sfile + " " + "-r" + " " + buf + " " + "-o" + " " + "1.txt";
                Process myproc = Process.Start(filename, MyArgs);
               
                if(myproc.HasExited)
                {
                    using(StreamReader sw = new StreamReader("1.txt", false))
                    {
                        string buffer2 = "";
                        int k = 0;
                        buffer2 = sw.ReadLine();
                        for (int i = 0; buffer2.Length > i; i++)
                        {
                            if (buffer2[i] == '|')
                            {
                                k++;
                            }
                        }
                        Console.WriteLine("Our result: {0} ", k);
                        sw.Close();
                    }
                }
                myproc.Close();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2019, 10:59
Ответы с готовыми решениями:

Проблема в Delphi XE при работе с XLS файлами
Доброго времени суток! Столкнулся с непредвиденным поведением OleObject MS Excel в Delphi XE7....

проблема при работе с китайским J-LINK 8 или же проблема с с
Всем привет. Решил Сам собрать себе дисковери кит на базе at91sam7s64-ek. Подарили мне китайский...

Программа по работе с файлами
Помогите сделать программу. Очень надо. От этого зависит моя жизнь! Суть её вот в чём: Надо в...

Дополнение к работе с файлами
Здравствуйте, ситуация довольно глупая, но умудрились почти поссориться с товарищем из группы. Вот...

7
Эксперт .NET
8116 / 5549 / 937
Регистрация: 21.01.2016
Сообщений: 21,194
23.12.2019, 11:14 2
Vlast001, ну, так вы не дожидаетесь завершения запущенного вами процесса. Подпишитесь на событие Process.Exited.
0
12 / 9 / 3
Регистрация: 08.01.2019
Сообщений: 454
23.12.2019, 11:27  [ТС] 3
Usaga, Можете объяснить как это сделать, а то я написал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
MyArgs = "-b" + " " + blank + " " + "-f" + " " + sfile + " " + "-r" + " " + buf + " " + "-o" + " " + "1.txt";
                using (Process myproc = Process.Start(filename, MyArgs))
                {
                    
                    if (myproc.Exited)
                    {
                        using (StreamReader sw = new StreamReader("1.txt", false))
                        {
                            string buffer2 = "";
                            int k = 0;
                            buffer2 = await sw.ReadLineAsync();
                            for (int i = 0; buffer2.Length > i; i++)
                            {
                                if (buffer2[i] == '|')
                                {
                                    k++;
                                }
                            }
                            Console.WriteLine("Our result: {0} ", k);
                            sw.Close();
                        }
                    }                  
                    
                }
и в строчке
C#
1
if (myproc.Exited)
такая ошибка error CS0079: Событие "Process.Exited" может находиться только в левой части операции += или -=
Не представляю как это исправаить и куда припихнуть "+="
0
Эксперт .NET
8116 / 5549 / 937
Регистрация: 21.01.2016
Сообщений: 21,194
23.12.2019, 11:35 4
Vlast001, по ссылке пример для кого вообще?)
1
12 / 9 / 3
Регистрация: 08.01.2019
Сообщений: 454
23.12.2019, 11:54  [ТС] 5
Usaga, Ну смотрите, сделал по ссылке. Скомпилировал. Все хорошо, только вот вернулся к проблемам первого поста.

Часть мейна:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MyArgs = "-b" + " " + blank + " " + "-f" + " " + sfile + " " + "-r" + " " + buf + " " + "-o" + " " + "1.txt";
                using (Process myproc = Process.Start(filename, MyArgs))
                {
                    myproc.Exited += Myproc_Exited;
                        using (StreamReader sw = new StreamReader("1.txt", false))
                        {
                            string buffer2 = "";
                            int k = 0;
                            buffer2 = await sw.ReadLineAsync();
                            for (int i = 0; buffer2.Length > i; i++)
                            {
                                if (buffer2[i] == '|')
                                {
                                    k++;
                                }
                            }
                            Console.WriteLine("Our result: {0} ", k);
                            sw.Close();
                        }               
                    
                }
и где-то снизу после мейна))
C#
1
2
3
4
 private static void Myproc_Exited(object sender, EventArgs e)
        {
 
        }
Добавлено через 15 минут
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
так вы не дожидаетесь завершения запущенного вами процесса
Уже ж то дожидаюсь, в чем проблема то? Почему по факту ничего не поменялось в работе приложения?
Помогите пожалуйста.
Что я делаю не так?
0
Эксперт .NET
8116 / 5549 / 937
Регистрация: 21.01.2016
Сообщений: 21,194
23.12.2019, 13:15 6
Цитата Сообщение от Vlast001 Посмотреть сообщение
Уже ж то дожидаюсь, в чем проблема то?
Где вы дожидаетесь? Вы пустой метод подписали на событие. А к файлу всё равно обращаетесь сразу после подписки не дожидаясь завершения процесса. Вы почитайте про события.
0
12 / 9 / 3
Регистрация: 08.01.2019
Сообщений: 454
23.12.2019, 13:43  [ТС] 7
Usaga, А как тогда дожидаться?
Я не понимаю как работают эти строчки
C#
1
2
3
4
5
6
7
8
9
10
11
12
 // Wait for Exited event, but not more than 30 seconds.
            const int SleepAmount = 100;
            while (!eventHandled)
            {
                elapsedTime += SleepAmount;
                if (elapsedTime > 30000)
                {
                    break;
                }
                
                Thread.Sleep(SleepAmount);
            }
Добавлено через 10 минут
Цитата Сообщение от Vlast001 Посмотреть сообщение
Я не понимаю как работают эти строчки
Даже не так, я создал проект и положил туда код с мсдн, и он даже не скомпился
0
Эксперт .NET
8116 / 5549 / 937
Регистрация: 21.01.2016
Сообщений: 21,194
23.12.2019, 13:57 8
Vlast001, прочитайте пятую главу online-учебника по C#. Без базиса по работе с событиями продолжать методом тыка работать не стоит.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2019, 13:57

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Литература по работе с файлами
Уважаемые программисты,подскажите,пожалуйста - возможно кто-то помнит литературу с уклоном на...

Задание по работе с файлами
Для двух файлов A и B, которые включают по 20 элементов :A = ({a}_{i}),B = ({b}_{i}),I=...

Магия в работе с файлами
Пример взят с сайта PHP.SU: Урок 8: <?PHP chdir('/usr/tmp'); $src = fopen('f1.txt', 'r'); //...

Подскажите по работе с файлами
struct MyStruct { char * Nam; unsigned int Salary; }; MyStruct emp; *emp.Nam="Ivan...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.