Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428

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

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

Студворк — интернет-сервис помощи студентам
Нужно при закрытии программы в файл вывести историю введенных команд. Как это реализовать можно?
Подробнее: в консольном приложении в c# вводим команды. В дальнейшем при нажатии кнопки вверх мы видим предыдущую введенную команду. Нужно: получить данный список команд в файл. Желательно: проделать обратную операцию, т.е. при загрузке программы в данный "буфер" записать команды из этого файла.
Есть идея: при введении команды сразу дописывать её в файл, но как бы понимаю, что это не ок, часто открывать и закрывать поток... А как проделать записать обратно не понятно... Какие идеи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2014, 17:32
Ответы с готовыми решениями:

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

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

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

21
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.03.2014, 17:43
Пишите в память. MemoryStream().
0
 Аватар для pokerface
209 / 174 / 48
Регистрация: 20.09.2012
Сообщений: 481
24.03.2014, 17:49
Цитата Сообщение от insite2012 Посмотреть сообщение
Пишите в память. MemoryStream().
тогда надо фиксировано писать, иначе при новом запуске приложения уже навряд можно будет найти эти данные.

Как по мне так лучше писать лог в файл и не париться. Сначала пишем например в список, а затем подгружаем.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.03.2014, 17:51
Ну если постоянно будут идти команды, может имеет смысл кидать их в память, а при закрытии приложения уже писать в файл... Хотя тут тоже проблемка назреет, отследить закрытие консоли не так-то просто...
0
 Аватар для pokerface
209 / 174 / 48
Регистрация: 20.09.2012
Сообщений: 481
24.03.2014, 18:02
insite2012, ну тогда да. А отсделить закрытие можно, API всегда спасает)
http://geekswithblogs.net/mrna... 11594.aspx
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
24.03.2014, 18:09
Да, я в курсе про API, только сегодня тестил такую штуку. Только там в обработчик много не сунешь, быстро все происходит...
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
24.03.2014, 18:38  [ТС]
Для начала вопрос, как оттуда достать список введенных команд? где-то же он есть? и как при открытии программы туда хотя бы его же и загрузить? Как вообще что-то записать в поле ввода?
0
 Аватар для pokerface
209 / 174 / 48
Регистрация: 20.09.2012
Сообщений: 481
24.03.2014, 18:51
Я всё же придерживаюсь записи в список. например
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
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
24.03.2014, 19:23  [ТС]
Цитата Сообщение от pokerface Посмотреть сообщение
Я всё же придерживаюсь записи в список. например
Как при следующем запуске, при нажатии кнопки вверх или вниз, в стоке ввода появлялись ранее введенные команды?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
24.03.2014, 20:46
ORLENOK, ознакомтесь паттерном проэктирования Команда.
Википедия

Добавлено через 1 минуту
а для сохранения истории используйте сериализацию: мсдн (при закрытии программы сериализуем историю команд, а при открытии - десериализуем)
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
24.03.2014, 22:37  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
(при закрытии программы сериализуем историю команд, а при открытии - десериализуем)
Вопрос в том, где, как, какой, что отвечает за хранение истории введенных команд? Создавать самому, я могу её создать, дописывать в list, могу. но стандартная история команд где хранится?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
24.03.2014, 23:22
ORLENOK, в list. К которому доступ есть только у самой консольки. Как и у вашего, если сделаете, будет доступ только изнутри приложения.
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
25.03.2014, 00:16  [ТС]
Вопрос номер 2. Как эти команды вставить в строку ввода? Как вообще вставлять текст в строку ввода?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.03.2014, 02:13
Цитата Сообщение от 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
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
25.03.2014, 10:50  [ТС]
Цитата Сообщение от NickoTin Посмотреть сообщение
GetConsoleCommandHistoryW
По коду несколько вопросов, что это^ и с чем это есть? Написал dllimport и толку 0. Есть скинет кто нибудь, хотя бы начало этого кода на c# буду очень признателен. Получение этого списка стопорит дальнейшее выполнение курсовой...
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
25.03.2014, 11:06
ORLENOK, вы ознакомились со статьей в Википедии?
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
25.03.2014, 12:30  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
ORLENOK, вы ознакомились со статьей в Википедии?
Да, я понимаю, что тут список команд храниться в List<> , и при отмене команды происходит "инверсия" команд идущих после... Я у себя так же могу записать команды в лист. Это не проблематично для меня. Мне нужно их в дальнейшем использовать. Вставить в строку ввода в Консольном приложении c#.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
25.03.2014, 15:48
ORLENOK, нашел.
только, похоже, что надо создать программу-исполнитель и программу-оболочку, которая будет запускать первую и отправлять ей команды и сохранять их между запусками.
1
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
26.03.2014, 18:42  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
только, похоже, что надо создать программу-исполнитель и программу-оболочку, которая будет запускать первую и отправлять ей команды и сохранять их между запусками.
Думаю это тоже не то... Попробуйте открыть консоль. Написать несколько команд, нажать стрелку вверх(выбрать предыдущую команду), Вы сможете её изменить, курсором перемещаться по этой строке и изменить текст. Мне нужно сделать подобие этого. Сейчас вся запара в этом...Как считать команды из файла я знаю, и как записать их в файл я тоже знаю.
0
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
28.03.2014, 07:40  [ТС]
Проблема решилась написанием своего обработчика ввода. Всем спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.03.2014, 07:40
Помогаю со студенческими работами здесь

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

Выполнение программой команд, введенных в TextBox
Помогите, пожалуйста. Допустим на форме есть TextBox1 и Button1 Если написать в TextBox1: me.visible false wait 3000 me.visible...

Выполнение команд в консоли из приложения QT
Добрый день. Такая ситуация. Необходимо выполнить команду в консоли, которая превращает JSON файл в YAML. Соответственно при наборе...

Автоматический запуск команд в консоли
Есть консольная программа, adb.exe. Чтобы ее запустить, я вынужден каждый раз переходить в папку с программой, запускать из этой папки...

Автоматизация исполнения команд в консоли
Доброго времени суток. Столкнулся с проблемой следующего характера: 1. Система Linux CentoS 5 2. Сервер Plazma написанный на java и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru