Тема: AHK: FileAppend добавление текста в первую строку
Добрый день!
Как сделать добавление текста в файле в первую строку, все остальные сдвигались вниз.
^1::
FileAppend, %Clipboard% `n , C:\123.txtВы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добрый день!
Как сделать добавление текста в файле в первую строку, все остальные сдвигались вниз.
^1::
FileAppend, %Clipboard% `n , C:\123.txtПрочитать файл в переменную. Удалить файл. Записать в файл первую строку. Добавить всё остальное.
неужто нет как FileReadLine
^1::
FileReadLine, OutputVar, C:\123.txt, 1FileAppendLineAtStart? Не, нету.
FileAppendLineAtStart? Не, нету.
Если есть возможность дайте пожалуйста ссылку.
Ссылку на что?
FileAppendLineAtStart? Не, нету.
вопрос про это.
Прочитать файл в переменную. Удалить файл. Записать в файл первую строку. Добавить всё остальное.
Не так всё просто, как кажется. Нужно учесть два момента:
1. Какой вид переноса строки используется в файле.
2. Кодировку исходного файла.
YMP пишет:FileAppendLineAtStart? Не, нету.
вопрос про это.
Ссылку на то, чего нету? Это как? ![]()
YMP пишет:Прочитать файл в переменную. Удалить файл. Записать в файл первую строку. Добавить всё остальное.
Не так всё просто, как кажется. Нужно учесть два момента:
1. Какой вид переноса строки используется в файле.
2. Кодировку исходного файла.
Это уже темы для следующих вопросов.
Возможно, они и не возникнут, так зачем голову забивать?
red2881 пишет:YMP пишет:FileAppendLineAtStart? Не, нету.
вопрос про это.
Ссылку на то, чего нету? Это как?
Понятно.
Прочитать файл в переменную. Удалить файл. Записать в файл первую строку. Добавить всё остальное.
Т.е это единственный вариант как можно произвести запись текста в первую строку сдвинув вниз все остальные
Не, нету.
прочитал как двойное отрицание и пошел искать по форуму. Минус на минус дает плюс )))
red2881, обратите внимание, мы используем заглавные буквы в начале предложений и точки в конце.
Т.е это единственный вариант как можно произвести запись текста в первую строку сдвинув вниз все остальные
Ну а как иначе вы сдвинете? Считываете содержимое файла в память, потом пишете обратно уже со сдвигом.
Можно использовать объект File, там не нужно будет файл удалять, но в остальном та же логика.
так зачем голову забивать?
Я думал, ты перфекционист. ![]()
red2881 пишет:Т.е это единственный вариант как можно произвести запись текста в первую строку сдвинув вниз все остальные
Ну а как иначе вы сдвинете? Считываете содержимое файла в память, потом пишете обратно уже со сдвигом.
Можно использовать объект File, там не нужно будет файл удалять, но в остальном та же логика.
Понял. Спасибо.
У самого встала задача писать логи и, конечно, думал что есть более красивое решение, чем затирать и создавать заново файл..
Более красивое решение — использовать File Object.
teadrinker
Не подскажите как например, этим способом, не пересоздавая файл заново заменить вторую строку в файле из 6 символов, строкой из 3?
Единственный показавшийся достойным способ:
file := FileOpen("Filename.txt", "rw")
file.Seek(StrLen(file.ReadLine()))
file.Write("123")
Перезаписывает первые три символа, оставляя остальную часть строки без изменений, а надо чтобы всё содержимое строки было заменено.
Для такой задачи это не самый удобный метод, в любом случае придется читать файл целиком, чтобы сдвинуть остальную часть. Так что лучше считать файл обычным способом, заменить вторую строку, и переписать заново.
Перезаписывает первые три символа, оставляя остальную часть строки без изменений, а надо чтобы всё содержимое строки было заменено.
Остаток пробелами заполнить?
teadrinker
Понял, благодарю.
YMP
Пробелами нельзя. Нужно хранить хендлы окон запущенных ранее приложений, поэтому пробелы недопустимы. А перезапись нужна для обновления хендла. И вопрос сразу появился -> всегда ли номера хендлов из одинакового количества символов?
Нужно хранить хендлы окон запущенных ранее приложений
IniRead почитайте.
serzh82saratov
С текстом проще. По крайней мере в прошлом софте у меня так и было реализовано. Положил строки из файла в массив на старте, а если в процессе приходится хендл обновлять, то в помощь было 2 функции, одна удаляла строку со старым значением сдвигая все следующие вверх, а вторая вставляла в это же положение новое значение сдвигая строки от текущей обратно. С инишкой понятное дело, что даже нагляднее, но по совету teadrinker'a такая реализация всё же пришлась по душе:
ReWriteStr(txtAdress, strNmbr, newString) {
Loop, Read, %txtAdress%
workArr.Push(A_LoopReadLine)
workArr[strNmbr] := newString
file := FileOpen(txtAdress, "w", "UTF-8")
strt := 1
while (strt <= workArr.Length()) {
new_str := % workArr[strt] "`r`n"
file.Write(new_str)
strt++
}
}
Просто думал, что есть способ перезаписи строки в нужное состояние прямо в открытом файле без перезаписи всего файла. Но на нет и суда нет. А что по количеству символов в хендле, не подскажете, всегда ли оно одинаково? В предыдущем софте хендл указывался в десятичном формате и там это значение всегда было из одинакового количества знаков.
С текстом проще
Вам виднее.
А что по количеству символов в хендле, не подскажете, всегда ли оно одинаково?
Нет.
serzh82saratov
Благодарю.
Пробелами нельзя. Нужно хранить хендлы окон запущенных ранее приложений, поэтому пробелы недопустимы.
Так пробелы потом отбросить не проблема. Есть функция Trim.
YMP но тогда надо знать максимально возможную длинну хендла и учитывать формат чисел.
Ну, можно выделить место под максимальное 64-битное целое в десятичном формате, больше-то никак не будет.
Только проще наверное не пробелами а нулями, их потом не надо отбрасывать, или можно просто добавить ноль.
n := 1
MsgBox % Format("{:019d}", n)Да, так лучше.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться