Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
1

История введенных команд в консоли

24.03.2014, 17:32. Просмотров 1639. Ответов 21
Метки нет (Все метки)

Нужно при закрытии программы в файл вывести историю введенных команд. Как это реализовать можно?
Подробнее: в консольном приложении в c# вводим команды. В дальнейшем при нажатии кнопки вверх мы видим предыдущую введенную команду. Нужно: получить данный список команд в файл. Желательно: проделать обратную операцию, т.е. при загрузке программы в данный "буфер" записать команды из этого файла.
Есть идея: при введении команды сразу дописывать её в файл, но как бы понимаю, что это не ок, часто открывать и закрывать поток... А как проделать записать обратно не понятно... Какие идеи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2014, 17:32
Ответы с готовыми решениями:

Создание и исполнение команд в консоли из плагинов
Доброго времени суток. Как можно сделать объект команды, на подобие public...

Выполнение команд в консоли. Как выполните вход в определенный каталог
подскажите пожалуйста, как выполните вход в определенный каталог... Использую...

Повторять процедуру авторизации в консоли при неверно введенных данных
День добрый, Заранее прошу извинения если вопрос задан глупо так как я...

История браузеров
Приветствую всех. Собственно, как посмотреть историю посещения сайтов...

Запись в файл 10 имен последних открытых файлов (история)
Всем доброго времени суток! Возник следующий вопрос. Как записать значения...

21
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
24.03.2014, 17:43 2
Пишите в память. MemoryStream().
0
pokerface
203 / 168 / 48
Регистрация: 20.09.2012
Сообщений: 450
24.03.2014, 17:49 3
Цитата Сообщение от insite2012 Посмотреть сообщение
Пишите в память. MemoryStream().
тогда надо фиксировано писать, иначе при новом запуске приложения уже навряд можно будет найти эти данные.

Как по мне так лучше писать лог в файл и не париться. Сначала пишем например в список, а затем подгружаем.
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
24.03.2014, 17:51 4
Ну если постоянно будут идти команды, может имеет смысл кидать их в память, а при закрытии приложения уже писать в файл... Хотя тут тоже проблемка назреет, отследить закрытие консоли не так-то просто...
0
pokerface
203 / 168 / 48
Регистрация: 20.09.2012
Сообщений: 450
24.03.2014, 18:02 5
insite2012, ну тогда да. А отсделить закрытие можно, API всегда спасает)
http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx
1
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
24.03.2014, 18:09 6
Да, я в курсе про API, только сегодня тестил такую штуку. Только там в обработчик много не сунешь, быстро все происходит...
0
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
24.03.2014, 18:38  [ТС] 7
Для начала вопрос, как оттуда достать список введенных команд? где-то же он есть? и как при открытии программы туда хотя бы его же и загрузить? Как вообще что-то записать в поле ввода?
0
pokerface
203 / 168 / 48
Регистрация: 20.09.2012
Сообщений: 450
24.03.2014, 18:51 8
Я всё же придерживаюсь записи в список. например
C#
1
2
3
4
5
6
7
8
List <string> log = new <string>();
string result="";
result= Console.ReadLine();
if(result!="")
{
   log.Add(result);
}
// и дальше  ваш код
1
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
24.03.2014, 19:23  [ТС] 9
Цитата Сообщение от pokerface Посмотреть сообщение
Я всё же придерживаюсь записи в список. например
Как при следующем запуске, при нажатии кнопки вверх или вниз, в стоке ввода появлялись ранее введенные команды?
0
Learx
1045 / 852 / 194
Регистрация: 31.03.2010
Сообщений: 2,487
24.03.2014, 20:46 10
ORLENOK, ознакомтесь паттерном проэктирования Команда.
Википедия

Добавлено через 1 минуту
а для сохранения истории используйте сериализацию: мсдн (при закрытии программы сериализуем историю команд, а при открытии - десериализуем)
0
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
24.03.2014, 22:37  [ТС] 11
Цитата Сообщение от Learx Посмотреть сообщение
(при закрытии программы сериализуем историю команд, а при открытии - десериализуем)
Вопрос в том, где, как, какой, что отвечает за хранение истории введенных команд? Создавать самому, я могу её создать, дописывать в list, могу. но стандартная история команд где хранится?
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
24.03.2014, 23:22 12
ORLENOK, в list. К которому доступ есть только у самой консольки. Как и у вашего, если сделаете, будет доступ только изнутри приложения.
0
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
25.03.2014, 00:16  [ТС] 13
Вопрос номер 2. Как эти команды вставить в строку ввода? Как вообще вставлять текст в строку ввода?
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
25.03.2014, 02:13 14
Цитата Сообщение от ORLENOK Посмотреть сообщение
но стандартная история команд где хранится?
Переводить на C# лень -_-
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* Return:
 *      History buffer length in bytes
 */
typedef DWORD(WINAPI * GetConsoleCommandHistoryLengthW)(
    IN LPWSTR ExeName
    );
 
/* Return:
 *      History buffer length in bytes
 *
 * [OUT] Commands
 *      Array of strings. Example: "value0\0value1\0"
 */
typedef DWORD(WINAPI * GetConsoleCommandHistoryW)(
    OUT LPWSTR Commands,
    IN DWORD CommandBufferLength,
    IN LPWSTR ExeName
    );
 
static GetConsoleCommandHistoryLengthW pGetConsoleCommandHistoryLengthW = NULL;
static GetConsoleCommandHistoryW pGetConsoleCommandHistoryW = NULL;
 
int wmain()
{
    DWORD  dwBufferLength = 0;
    LPWSTR wsExeName = GetCurrentExeFileName();
    LPWSTR wsCommandsBuffer = NULL;
 
    //// Тестовое заполнение буфера команд: _getws_s аналог Console.ReadLine()
    //WCHAR  wsTemp[MAX_PATH] = { 0 };
 
    //_getws_s(wsTemp, MAX_PATH);
    //_getws_s(wsTemp, MAX_PATH);
    //// ---
 
    // Поулчаем адреса функций GetConsoleCommandHistoryLengthW и GetConsoleCommandHistoryW
    // В C# можно обойтись используя
    //      DllImport("kernel32.dll", ...)
    //      static extern int GetConsoleCommandHistoryLengthW(...)
    //
    // В GetConsoleCommandHistoryW первым параметром лучше всего использовать IntPtr, либо char*,
    // память выделять через Marshal.AllocHGlobal
    //
    pGetConsoleCommandHistoryLengthW = (GetConsoleCommandHistoryLengthW)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetConsoleCommandHistoryLengthW");
    pGetConsoleCommandHistoryW = (GetConsoleCommandHistoryW)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetConsoleCommandHistoryW");
 
    dwBufferLength = pGetConsoleCommandHistoryLengthW(wsExeName);
    wsCommandsBuffer = (LPWSTR)malloc(dwBufferLength);
    memset(wsCommandsBuffer, 0, dwBufferLength);
 
    dwBufferLength = pGetConsoleCommandHistoryW(wsCommandsBuffer, dwBufferLength, wsExeName) / sizeof(WCHAR);
 
    // Выводим записи
    for (DWORD i = 0; i < dwBufferLength; i++)
    {
        LPWSTR wsCommand = wsCommandsBuffer + i;
        size_t len = wcslen(wsCommand);
 
        _putws(wsCommand);
        i += len;
    }
 
    free(wsCommandsBuffer);
    return 0;
}
1
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
25.03.2014, 10:50  [ТС] 15
Цитата Сообщение от NickoTin Посмотреть сообщение
GetConsoleCommandHistoryW
По коду несколько вопросов, что это^ и с чем это есть? Написал dllimport и толку 0. Есть скинет кто нибудь, хотя бы начало этого кода на c# буду очень признателен. Получение этого списка стопорит дальнейшее выполнение курсовой...
0
Learx
1045 / 852 / 194
Регистрация: 31.03.2010
Сообщений: 2,487
25.03.2014, 11:06 16
ORLENOK, вы ознакомились со статьей в Википедии?
0
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
25.03.2014, 12:30  [ТС] 17
Цитата Сообщение от Learx Посмотреть сообщение
ORLENOK, вы ознакомились со статьей в Википедии?
Да, я понимаю, что тут список команд храниться в List<> , и при отмене команды происходит "инверсия" команд идущих после... Я у себя так же могу записать команды в лист. Это не проблематично для меня. Мне нужно их в дальнейшем использовать. Вставить в строку ввода в Консольном приложении c#.
0
Learx
1045 / 852 / 194
Регистрация: 31.03.2010
Сообщений: 2,487
25.03.2014, 15:48 18
ORLENOK, нашел.
только, похоже, что надо создать программу-исполнитель и программу-оболочку, которая будет запускать первую и отправлять ей команды и сохранять их между запусками.
1
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
26.03.2014, 18:42  [ТС] 19
Цитата Сообщение от Learx Посмотреть сообщение
только, похоже, что надо создать программу-исполнитель и программу-оболочку, которая будет запускать первую и отправлять ей команды и сохранять их между запусками.
Думаю это тоже не то... Попробуйте открыть консоль. Написать несколько команд, нажать стрелку вверх(выбрать предыдущую команду), Вы сможете её изменить, курсором перемещаться по этой строке и изменить текст. Мне нужно сделать подобие этого. Сейчас вся запара в этом...Как считать команды из файла я знаю, и как записать их в файл я тоже знаю.
0
ORLENOK
86 / 86 / 35
Регистрация: 05.08.2011
Сообщений: 400
Завершенные тесты: 5
28.03.2014, 07:40  [ТС] 20
Проблема решилась написанием своего обработчика ввода. Всем спасибо за помощь!
0
28.03.2014, 07:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 07:40

Почему в консоле история команд чистится
Всем привет, После установки Kubuntu 18, заметил что используя консоль закрыв...

История консоли Packet Tracer
Приветствую. Вопрос такой. Как посмотреть историю консоли в PKT ? Возможно...

Интерпретация команд, введенных в TextBox
вот такой вопрос: как лучше оформить код чтобы &quot;комп знал что делать&quot; , умно...


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

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

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