Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > VB6 > Работа с файлом |
Автор: Wilmor 18.4.2006, 14:58 |
Как добавить в фаил текст, не стирая текста который там уже есть.![]() |
Автор: boevik 18.4.2006, 16:54 | ||
|
Автор: ИгнатьевАлексей 21.4.2006, 16:07 |
Скажите пожалуйста! А зачем здесь объявление констант в первой строке? |
Автор: Akina 21.4.2006, 17:29 |
а для получения читаемого кода. |
Автор: goldstarKZ 3.5.2006, 05:57 |
А просто Open "C:\test.txt" for Append as #1 Не канает? |
Автор: Akina 3.5.2006, 09:01 |
1) Пользуемся тегом "Код". 2) Обходимся без сленга. 3) В объектно-ориентированном языке желательно избегать процедурно-ориентированных приемов программирования. |
Автор: XPurple 4.5.2006, 14:02 |
А прочитать все строчки из текстового файла ? [off]просьба не пинать - у меня пока не установлены MSDN и нет книги[/off] |
Автор: boevik 4.5.2006, 14:31 | ||
MSDN есть в online на сайте http://msdn1.microsoft.com/en-us/default.aspx.
|
Автор: XPurple 5.5.2006, 05:03 |
Благодарю за информацию и насчет MSDN - тоже. |
Автор: XPurple 5.5.2006, 05:24 |
А как избежать ошибки при открытии несуществующего файла? Если файл не существует, то выдается run-time error. |
Автор: XPurple 5.5.2006, 09:48 |
благодарствую. |
Автор: XPurple 5.5.2006, 13:55 |
А как избежать ошибки чтения файла нулевой длины ? Сейчас при открытии такого файла на чтение выдается Run-time сообщение "Input past end of file" |
Автор: vbCrLf 5.5.2006, 14:20 | ||
Перед чтением файла проверь его размер. Делается это с помощью функции FileLen(PathName as String) As Long, которая возвращает размер файла в байтах.
|
Автор: Тутанхамец 5.5.2006, 14:40 | ||
А учитывая, что "в объектно-ориентированном языке желательно избегать процедурно-ориентированных приемов программирования", то так:
|
Автор: XPurple 6.5.2006, 09:37 |
Спасибо. Будем учиться писать правильно |
Автор: XPurple 10.5.2006, 07:23 |
Функция Dir какому методу соответствует в объектно-ориентированном способе ? |
Автор: boevik 10.5.2006, 07:31 | ||||||
Dir возвращает по одному имени файлу в соотвествии маски из заданной папки. Т.е, если надо получить имена всех файлов в папке, то требуется выполнить loop
Так же при помощи dir можно проверить существует ли определенный файл, т.е соотвествие FileExists
|
Автор: Тутанхамец 10.5.2006, 08:20 | ||
А если нужен список файлов или подпапок, то есть объект Folder с коллекциями SubFolders и Files.
|
Автор: XPurple 10.5.2006, 10:13 | ||
Не пойму как пользоваться DirectoryExists. Выдает run-time ошибку Object doesn't support this property or method на
|
Автор: Тутанхамец 10.5.2006, 11:20 |
А почему ты решил, что такой метод есть? FolderExists. Вообще-то документацию бы неплохо почитать. В MSDN про fileSystemObject много интересных вещей написано. |
Автор: XPurple 10.5.2006, 11:28 |
Я не знаю, есть ли такой метод, поэтому и спрашиваю http://search.msdn.microsoft.com/search/default.aspx?__VIEWSTATE=&query=DirectoryExists&siteid=0&tab=0 |
Автор: Тутанхамец 10.5.2006, 11:39 |
Я думал мы говорим о Visual Basic 6 и FileSystemObject. А ты смотришь документацию для VB.NET. |
Автор: XPurple 10.5.2006, 11:40 | ||
Как при считывании из текстового файла строки с:\windows ReadAll() отбрасывать перевод строки OD OA ? Иначе при выводе такой информации получается что-то типа c:\windows|||| Добавлено @ 11:44
Понятно. Я VB.Net знаю также плохо как и VB6. Нашел описание по ссылке MSDN, поиском которого мне советовали воспользоваться уважаемые участники этой темы. |
Автор: Тутанхамец 10.5.2006, 11:47 | ||
Либо:
Либо: метод ReadLine Description Reads an entire line (up to, but not including, the newline character) from a TextStream file and returns the resulting string. Syntax object.ReadLine The object argument is always the name of a TextStream object. Remarks The following example shows how to use the ReadLine method to read a line from a TextStream file and return the string: Function ReadLineTextFile Const ForReading = 1, ForWriting = 2 Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True) f.Write "Hello world!" Set f = fso.OpenTextFile("c:\testfile.txt", ForReading) ReadLineTextFile = f.ReadLine End Function Добавлено @ 11:51 В той же сетевой MSDN есть и про FileSystemObject http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/0fa93e5b-b657-408d-9dd3-a43846037a0e.asp |
Автор: Akina 10.5.2006, 11:57 | ||
ReadAll считывает в строковую переменную ВЕСЬ файл. Либо ты будешь читать построчно, как описано выше. Либо ты считаешь сразу весь файл, а потом порежешь его на строки, что проще всего делается функцией Split. |
Автор: XPurple 10.5.2006, 12:30 |
Спасибо, получилось. Как автоматически закончить программу после выполенения каких-либо действий ? Т.е., например, вывести список файлов в файл и закончить программу. |
Автор: Akina 10.5.2006, 12:57 |
В нужном месте кода написАть слово End. Перед ним разместить код закрытия всех файлов, коннекшнов, выгрузку всех объектов и пр. - в общем убрать за собой. |
Автор: XPurple 10.5.2006, 13:11 |
А как это сделать ? |
Автор: XPurple 10.5.2006, 13:39 |
Как избежать run-time ошибки Access denied ? (Ох уж эти ошибки Run-time - Никогда не думал, что большую часть времени тратить на это) |
Автор: Akina 10.5.2006, 14:33 |
Следить за правами доступа. |
Автор: XPurple 11.5.2006, 05:08 |
Это понятно. Я имею ввиду,какой фукцией проверить: есть или нет доступ на запись. IOPermission ? |
Автор: boevik 11.5.2006, 07:22 |
Возможно и есть такая функцуя, но IMHO, легче просто правильно обработать ошибку. Потому что между проверкох на доступ и реальным доступом, другой процесс может влезть и захватить файл. И опять вернулись к run-time error. |
Автор: XPurple 12.5.2006, 07:57 |
Хотелось бы знать как. Я ,к сожалению, не знаю. |
Автор: boevik 12.5.2006, 08:19 | ||
Слышал про On Error ...? Если нет, то почитай. Принцип такой:
При любой ошибке в коде управление перйдет к коду после label errHandle. |
Автор: Akina 12.5.2006, 12:55 |
До кучи почитай про иерархию обработчика ошибок - чтобы понимать какой сработает при отсутствии обработчика в процедуре... |
Автор: Тутанхамец 12.5.2006, 13:18 |
Хе-хе. Еще недели две, и эта тема будет полным справочником по VB. ![]() |
Автор: XPurple 12.5.2006, 13:33 | ||
Про коды ошибок я прочитал. Область действия "On error" do end-а или exit-а ? Я правильно понял ?
Так это ж хорошо! |
Автор: vbCrLf 12.5.2006, 13:55 | ||||
Область действия до End текущей процедуры/функции. err.Number - возвращает номер ошибки, err.Description - описание ошибки. Если вдруг Вам нужно игнорировать ошибки в Вашей процедуре/функции, то напишите в начале
Тогда при ошибке программа всё-равно будет продолжать выполняться, но в err.Number и err.Description будет занесена информация об ошибках. Для того, чтобы сбросить информацию об ошибке, используйте Err.Clear. |
Автор: XPurple 12.5.2006, 14:18 | ||
Программа заработала. До идеала, конечно, далеко. Хочу ,чтобы вы посоветовали, что сделано неправильно в программе
|
Автор: boevik 12.5.2006, 14:36 |
Для начало, разбей ка эту функцию в 60 строк на несколько мелких функций, где каждая выполняет одно действие. К примеру, открытие файла с проверками на существование и т.п., запись в файл - другая функция. Будет легче читать и тестировать. |
Автор: XPurple 12.5.2006, 14:44 |
Думал, только мне тяжело читать. Разобью, спасибо за совет. |
Автор: XPurple 16.5.2006, 05:15 |
Функция как значение возвращает ? Что-то не нашел. |
Автор: boevik 16.5.2006, 07:04 | ||
|
Автор: XPurple 16.5.2006, 08:41 | ||
Гран-мерси Перевел часть кода в виде процедур и функций
|
Автор: XPurple 16.5.2006, 14:48 |
Как вывести список директорий с вложениями ? |
Автор: Akina 16.5.2006, 15:13 |
Гм... вывести куда? чем тебе стандартный DirListBox не покатил? |
Автор: XPurple 17.5.2006, 04:59 |
В текстовый файл в виде FileTree |
Автор: Тутанхамец 17.5.2006, 08:45 | ||
Как вариант. Тебе нужна рекурсивная функция, которая перебирает всё, что лежит в папке (начиная, допустим, с диска С). Встретив файл, функция добавляет его в список (или выводит куда-то), а встретив папку - не только добавляет ее в список, но и вызывает себя же для перебора содержимого найденной папки. Примерно так:
Сейчас пишу без VB, так что ошибки могут быть ![]() А из основной проги вызываешь эту процедуру для самой верхней папки, которую тебе надо рассмотреть: типа search "c:\windows" |
Автор: XPurple 17.5.2006, 10:15 | ||
Спасибо. Идея ясна. Вот что получилось в итоге
|
Автор: XPurple 17.5.2006, 10:41 | ||
Как несколько одинаковых символов сгруппировать, например chr(151)? А то, на мой взгляд, длинная строчка получилась. Некрасиво как-то.
Не так давно в этой теме спрашивал: каким методом можно проверить, существует ли директория. Думал, по аналогии с методом FileExists он называется DirectoryExists. Оказалось, что это метод FolderExists. p.s. Мне с помощью объектов FSO очень понравилось программировать. Кстати, абсолютно несложно. Гораздо легче, чем варьируя комбинациями функций open, close, dir и пр. К тому же, у функции Dir - оказался ,я даже не знаю как правильно сказать, неверное определение статуса зашаренной корневой папки. Dir("\\share\resurs",vbDirectory) выдавал, у меня во всяком случае, 52 Run-time error "Bad file name or number" p.p.s Название сайта Vingrad - что означает ? Какой-то молдавский город ? |
Автор: Тутанхамец 17.5.2006, 12:26 | ||||
Во-первых, юзай константы в таких случаях. например встроенная константа vbCrLf - это перевод строки, то есть chr(13)+chr(10). Во-вторых - функция string.
По поводу FSO - согласен, вещь неплохая ![]() Насчет vingrad - не знаю. У меня ассоциируется с WinGrad и "виноградом, который зелен". ![]() Добавлено @ 12:27 По поводу твоей проги - не совсем понятно зачем объект передавать в параметрах функции как ByVal... |
Автор: XPurple 17.5.2006, 13:03 | ||||
Для рекурсивного вызова функции, если в папке есть подпапки. Новый объект-это subfolder, который найден в методе Subfolders для текущей папки
То, что нужно. Не пеняйте меня, я ведь еще только учусь. |
Автор: Тутанхамец 17.5.2006, 14:27 | ||
Пока тебя, вроде, никто и не пнул ![]()
Зачем передавать объект byVal? То есть по значению. Почему не ByRef? Во-первых я не уверен, что Visual Basic вообще передаст объект по значению (то есть как копию объекта в стеке). Возможно, для объектов ByVal и ByRef идентичны. Но тут я не уверен. Может и передаст - это-то мне и не нравится. Если он все-таки передаст по значению (как копию), зачем тебе нужно занимать место в стеке копиями объектов? Да еще во время рекурсивного вызова функции, когда стек и так активно используется. Используй ByRef, передавай ссылку на объект. Кроме того, лучше указывать тип параметра не as object, а конкретно - as Scripting.Folder. Ты ведь не собираешься передавать объекты разных типов. |
Автор: IvanB 17.5.2006, 15:24 | ||
А есть ли в объектоном виде замена такой конструкции:
Т.е. вопрос такой :"Можно ли через объекты работать с файлами параллельного (случайного) доступа?". |
Автор: cardinal 17.5.2006, 22:29 | ||||||
В FAQ'е эта функция есть. XPurple, делай сдвиги в коде, чтобы его было легче читать Например не
а
|
Автор: XPurple 18.5.2006, 05:18 | ||||
Исправлю.
Почему то у меня ругается на такой тип объектов. Обработчик выдает сообщение, что "user-defined type not defined" и ,кстати, обьявления объектов в таком виде "Dim fso As New FileSystemObject" тоже не объявляются по той же причине. Как это исправить ? Хорошо. |
Автор: Тутанхамец 18.5.2006, 08:04 | ||||
Зайди в меню "Проект" -> "Информации" (Project -> References) и поставь галочку напротив "Microsoft Scripting Runtime". Это список библиотек типов. Помеченные галочкой подключаются к твоему проекту и интепретатор их может различать. Чтобы посмотреть, какие типы данных уже, подключены нажми F2 или меню "Вид" -> Object Browser. Этот browser бывает полезен, когда надоп осмотреть, какие методы и свойства есть у какого-нибудь класса. Добавлено @ 08:12
Фигово, но, кажется, нет. По крайней мере так было сказано в бумажном руководстве по VB 6.0 от Microsoft Press. Еще там, правда, было сказано, что ситуация, возможно, изменится с новой версией FSO. |
Автор: XPurple 18.5.2006, 13:57 | ||
Как запустить программу как фоновую? Если просто написать End в точке выхода, то при загрузке программы высвечивается значок мышки в виде песочных часов.
У меня русифицированная версия, так еле-еле нашел, что References=Ссылки |
Автор: Тутанхамец 18.5.2006, 17:20 | ||
А у меня она русифицирована так галимо, что слово "Информации..." всего лишь один из перлов... Что значит запустить фоново? Если "фоновая программа" - это та, которую не видно, но которая работает, то простейший способ - в свойствах загружаемой формы установить visible в false. В принципе, можно мутить без форм что-то вроде:
Но в большинстве случаев это будет неудобно. Я так не делал никогда. По-моему, бейсик не для такого. P.S. Здесь вроде правило "Один вопрос - одна тема". Так действительно удобнее. Раз отошли от "Работы с файлом", то при следующих проблемах создавай новую тему. ![]() |
Автор: XPurple 19.5.2006, 05:03 | ||
Немного увлекся, хорошо. |