Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлом, Как добавить в фаил текст 
V
    Опции темы
XPurple
Дата 16.5.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



Как вывести список директорий с вложениями ? 
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
Akina
Дата 16.5.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Гм... вывести куда? чем тебе стандартный DirListBox не покатил? 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
XPurple
Дата 17.5.2006, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



В текстовый файл в виде FileTree 
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
Тутанхамец
Дата 17.5.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Как вариант. Тебе нужна рекурсивная функция, которая перебирает всё, что лежит в папке (начиная, допустим, с диска С). Встретив файл, функция добавляет его в список (или выводит куда-то), а встретив папку - не только добавляет ее в список, но и вызывает себя же для перебора содержимого найденной папки.

Примерно так:
Код


public sub Search(folderspec as string)
dim MyFile as variant, MySubFolder as variant, MyFolder as variant
Set MyFolder = fso.GetFolder(folderspec)

for each MyFile in MyFolder.Files
list1.additem lcase$(MyFile.Name)
next 

for each MySubFolder in MyFolder.SubFolders
list1.additem ucase$(MySubFolder.path)
search MySubFolder.path
next

end sub



Сейчас пишу без VB, так что ошибки могут быть smile 

А из основной проги вызываешь эту процедуру для самой верхней папки, которую тебе надо рассмотреть: типа search "c:\windows"

  

Это сообщение отредактировал(а) Тутанхамец - 17.5.2006, 08:45
PM MAIL   Вверх
XPurple
Дата 17.5.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



Спасибо. Идея ясна.
Вот что получилось в итоге
Код

Option Explicit
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, otf, gf, otf2 As Object
Dim sFile As String
Dim msg
Dim ConfFile, ResultFile, ResultDir As String
Dim confFileExist As Boolean
Dim fold As Object
Dim vfile As Object
Dim vdir As Object
Dim dirListStatus As String
Dim permissionFile As Boolean



Private Sub Form_Load()
ConfFile = "readdir.ini"
ResultDir = "\\media\Фильмы"
ResultFile = ResultDir & "\" & "Список фильмов.txt"
'ResultFile = "\\media\фильмы\Список фильмов.txt"
confFileExist = ReadConfFile()
'msg = MsgBox("Файл confFileExist" & confFileExist & " существует", vbInformation, "Результат")
On Error GoTo CheckError ' Turn on error handling.
    If confFileExist And fso.FolderExists(ResultDir) Then
    Set otf2 = fso.OpenTextFile(ResultFile, ForWriting, True)
    WriteListDir
    Else
    'msg = MsgBox("Файл resultDir" & fso.FolderExists(ResultDir) & " существует", vbInformation, "Результат")
    End If
 
CheckError:
permissionFile = PermissionAccess()

  End
End Sub

Public Function ReadConfFile() As Boolean

   Set fso = CreateObject("Scripting.FileSystemObject")
   If (fso.FileExists(ConfFile)) Then
        Set otf = fso.OpenTextFile(ConfFile, ForReading, True)
      Set gf = fso.GetFile(ConfFile)
             If gf.Size > 0 Then
             sFile = otf.ReadLine()
             'confFileExist = 1
             ReadConfFile = True
             'msg = MsgBox("Файл " & ConfFile & " нормальный", vbInformation, "Результат")
              Else
            'msg = MsgBox("Файл " & ConfFile & " пустой", vbInformation, "Результат")
            ReadConfFile = False
            'confFileExist = 0
            End If
          otf.Close
    Else
      'msg = MsgBox("Файл " & ConfFile & " не найден", vbInformation, "Результат")
   End If
End Function

Public Sub WriteListDir()
If fso.FolderExists(sFile) Then
Set fold = fso.GetFolder(sFile)
otf2.Write "Файлы в " & sFile & vbCrLf
dirListStatus = FileTree(fold)
otf2.Close
Else
'msg = MsgBox("Папка " & sFile & " не найдена", vbInformation, "Результат")
End If
End Sub

Public Function PermissionAccess() As Boolean
Const conErrPermissionDenied = 70
    If (Err.Number = conErrPermissionDenied) Then
    PermissionAccess = False
    'msg = MsgBox("Файл " & ResultFile & " не доступен", vbInformation, "Результат")
    Else
    'msg = MsgBox("Файл " & ResultFile & " доступен", vbInformation, "Результат")
        PermissionAccess = True
      End If
End Function

Public Sub ListFile()
For Each vfile In fold.Files
otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
otf2.Write (vfile.Name) & vbCrLf
Next
End Sub


Public Function FileTree(ByVal fold1 As Object) As String

For Each vdir In fold1.SubFolders
otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
otf2.Write UCase(vdir.Name) & vbCrLf
FileTree = FileTree(vdir)
Next
For Each vfile In fold1.Files
otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
otf2.Write (vfile.Name) & vbCrLf
Next
End Function

   

Это сообщение отредактировал(а) XPurple - 17.5.2006, 10:23
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
XPurple
Дата 17.5.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



Как несколько одинаковых символов сгруппировать, например chr(151)? А то, на мой взгляд, длинная строчка получилась. Некрасиво как-то.
Код

otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
 
Не так давно в этой теме спрашивал: каким методом можно проверить, существует ли директория. Думал, по аналогии с методом 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 - что означает ? Какой-то молдавский город ? 

Это сообщение отредактировал(а) XPurple - 17.5.2006, 11:13
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
Тутанхамец
Дата 17.5.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Цитата

Как несколько одинаковых символов сгруппировать, например chr(151)? А то, на мой взгляд, длинная строчка 


Во-первых, юзай константы в таких случаях. например встроенная константа vbCrLf - это перевод строки, то есть chr(13)+chr(10).

Во-вторых - функция string.

Код

MsgBox String(100, 169)
MsgBox String(50, Chr(169))
MsgBox String(13, "q")


По поводу FSO - согласен, вещь неплохая smile 

Насчет vingrad - не знаю. У меня ассоциируется с WinGrad и "виноградом, который зелен". smile

Добавлено @ 12:27 
По поводу твоей проги - не совсем понятно зачем объект передавать в параметрах функции как ByVal... 
PM MAIL   Вверх
XPurple
Дата 17.5.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



Цитата(Тутанхамец @  17.5.2006,  12:26 Найти цитируемый пост)
По поводу твоей проги - не совсем понятно зачем объект передавать в параметрах функции как ByVal...  

Для рекурсивного вызова функции, если в папке есть подпапки. Новый объект-это subfolder, который найден в методе Subfolders для текущей папки
Цитата

 String(50, Chr(169))

То, что нужно. Не пеняйте меня, я ведь еще только учусь.
 

Это сообщение отредактировал(а) XPurple - 17.5.2006, 13:13
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
Тутанхамец
Дата 17.5.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Пока тебя, вроде, никто и не пнул smile 

Цитата

Для рекурсивного вызова функции, если в папке есть подпапки. 


Зачем передавать объект byVal? То есть по значению. Почему не ByRef?

Во-первых я не уверен, что Visual Basic вообще передаст объект по значению (то есть как копию объекта в стеке). Возможно, для объектов ByVal и ByRef идентичны. Но тут я не уверен. Может и передаст - это-то мне и не нравится. 

Если он все-таки передаст по значению (как копию), зачем тебе нужно занимать место в стеке копиями объектов? Да еще во время рекурсивного вызова функции, когда стек и так активно используется. Используй ByRef, передавай ссылку на объект. 

Кроме того, лучше указывать тип параметра не as object, а конкретно -  as Scripting.Folder. Ты ведь не собираешься передавать объекты разных типов.  
PM MAIL   Вверх
IvanB
Дата 17.5.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: нет
Всего: 5



А есть ли в объектоном виде замена такой конструкции:
Код

Open "MYFILE.FIL" For Random As FileNum Len = RecLength
' Как написано в msdn-е

Т.е. вопрос такой :"Можно ли через объекты работать с файлами параллельного (случайного) доступа?". 
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
cardinal
Дата 17.5.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(Тутанхамец @  17.5.2006,  07:45 Найти цитируемый пост)
 Тебе нужна рекурсивная функция, которая перебирает всё, что лежит в папке (начиная, допустим, с диска С).

В FAQ'е эта функция есть.

XPurple, делай сдвиги в коде, чтобы его было легче читать
Например не
Код

Public Function FileTree(ByVal fold1 As Object) As String

For Each vdir In fold1.SubFolders
otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
otf2.Write UCase(vdir.Name) & vbCrLf
FileTree = FileTree(vdir)
Next
For Each vfile In fold1.Files
otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
otf2.Write (vfile.Name) & vbCrLf
Next
End Function

а
Код

Public Function FileTree(ByVal fold1 As Object) As String
For Each vdir In fold1.SubFolders
   otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
   otf2.Write UCase(vdir.Name) & vbCrLf
   FileTree = FileTree(vdir)
Next

For Each vfile In fold1.Files
   otf2.Write Chr(124) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(151) + Chr(62)
   otf2.Write (vfile.Name) & vbCrLf
Next
End Function
 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
XPurple
Дата 18.5.2006, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



Цитата(Тутанхамец @  17.5.2006,  14:27 Найти цитируемый пост)
Зачем передавать объект byVal? То есть по значению. Почему не ByRef?

Исправлю.

Цитата(Тутанхамец @  17.5.2006,  14:27 Найти цитируемый пост)
Кроме того, лучше указывать тип параметра не as object, а конкретно -  as Scripting.Folder. 


Почему то у меня ругается на такой тип объектов. Обработчик выдает сообщение, что "user-defined type not defined" и ,кстати, обьявления объектов в таком виде "Dim fso As New FileSystemObject" тоже не объявляются по той же причине. Как это исправить ?


Цитата(cardinal @  17.5.2006,  22:29 Найти цитируемый пост)
делай сдвиги в коде, чтобы его было легче читать


Хорошо.
 
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
Тутанхамец
Дата 18.5.2006, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



Цитата

Почему то у меня ругается на такой тип объектов. 


Зайди в меню "Проект" -> "Информации" (Project -> References) и поставь галочку напротив "Microsoft Scripting Runtime". Это список библиотек типов. Помеченные галочкой подключаются к твоему проекту и интепретатор их может различать. Чтобы посмотреть, какие типы данных уже, подключены нажми F2 или меню "Вид" -> Object Browser. Этот browser бывает полезен, когда надоп осмотреть, какие методы и свойства есть у какого-нибудь класса.

Добавлено @ 08:12 
Цитата

Т.е. вопрос такой :"Можно ли через объекты работать с файлами параллельного (случайного) доступа?".  


Фигово, но, кажется, нет. По крайней мере так было сказано в бумажном руководстве по VB 6.0 от Microsoft Press. Еще там, правда, было сказано, что ситуация, возможно, изменится с новой версией FSO. 
PM MAIL   Вверх
XPurple
Дата 18.5.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 4.5.2006
Где: Челябинск

Репутация: 1
Всего: 1



Как запустить программу как фоновую? Если просто написать End в точке выхода, то при загрузке программы высвечивается значок мышки в виде песочных часов.


Цитата(Тутанхамец @  18.5.2006,  08:04 Найти цитируемый пост)
Зайди в меню "Проект" -> "Информации" (Project -> References) и поставь галочку напротив "Microsoft Scripting Runtime". 


У меня русифицированная версия, так еле-еле нашел, что References=Ссылки 

Это сообщение отредактировал(а) XPurple - 18.5.2006, 14:16
--------------------
Кто никогда ни о чем не спрашивает: тот либо знает все, либо не знает ничего.  Не помню, кто сказал, может быть, я   (с) 
PM MAIL   Вверх
Тутанхамец
Дата 18.5.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: 4
Всего: 6



А у меня она русифицирована так галимо, что слово "Информации..." всего лишь один из перлов...

Что значит запустить фоново? Если "фоновая программа" - это та, которую не видно, но которая работает, то простейший способ - в свойствах загружаемой формы установить visible в false.

В принципе, можно мутить без форм что-то вроде:

Код

sub main

while true

sleep(10)

doevents

'...любой код, выполняющийся в цикле...

wend

end sub


Но в большинстве случаев это будет неудобно.  Я так не делал никогда. По-моему, бейсик не для такого. 

P.S. Здесь вроде правило "Один вопрос - одна тема". Так действительно удобнее. Раз отошли от "Работы с файлом", то при следующих проблемах создавай новую тему. smile  
  

Это сообщение отредактировал(а) Тутанхамец - 18.5.2006, 17:22
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.