Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как определить существует каталог или нет


Автор: korob2001 27.9.2004, 12:43
Всем привет!

Visual Basic изучаю совсем недавно, просто получилось так, что записался на курсы, по Java и VB ( отдельные курсы ). Заказал книги на русском языке, дабы не мучаться с нидерландским. Книги по Java пока не получил, а вот по VB уже есть. Вот и начал самостоятельно изучать VB, так как нидерландский язык знаю нормально, но не до такой степени что бы учить на нём новый для меня язык программирования, да и курсы эти один раз в неделю. По моему опыту этого недостаточно для хорошего знания языка программирования. Меня интересует не только корочка, которую я получу по окончании курсов, но и сами знания ( в первую очередь ).
Хожу на курсы, а дома учу самостоятельно то, что проходили на занятии, да и вперед уже маленько забежал ;). На курсах мы не дошли ещё до переменных, а самостоятельно уже изучаю работу с файлами.
Когда получу книги по Java, буду и с этим языком поступать также. Ну ладно, это уже лирика. Перейду к теме.

Проблема в следующем:
есть некая процедура, которая сначала создаёт каталог \Simple на диске C:\, затем в него складывает все необходимые файлы.
После первого запуска программы каталог успешно создаётся, но вот при последующих запусках выдаётся ошибка компиляции, точно не помню какая, я пишу не из дома. Но она указывает на строку, которая создаёт каталог \Simple, то есть на эту:
Код

MkDir ("C:\Simple")

Я конечно же понимаю почему - потому что данный каталог уже существует.
В общем мне необходима условная конструкция If, которая должна проверять каталог на несуществование, другими словами - если каталог C:\Simple не существует, то его нужно создать, в противном случае переходим к следующей строке после строки End If.
На Perl я бы сделал такую проверку так:
Код

if (!-e "C:/Simple") {
   # Создаём каталог
}

Переведу приведённый код на русский для тех, кто не знаком с Perl.
Если не существует ни файла, ни каталога с именем Simple на диске С:\ , то необходимо создать данный каталог.

Если я правильно понимаю, то мне необходима подобная проверка перед созданием каталога, на Visual Basic. Пробовал искать в книгах, но ничего не нашёл.

Подскажите: какое условие должно быть в конструкции If, что бы узнать, есть такой каталог или нет?

Заранее благодарен,
Денис

Автор: boevik 27.9.2004, 12:49
На VB проверка на существования файла или каталога можно осуществить функцией Dir.
Код
if Len(Dir("C:/Simple")) = 0 then
' Создаём каталог
End IF

Автор: cardinal 27.9.2004, 12:54
Код
Private Sub Command1_Click()
Dim oFSO As New FileSystemObject
Dim Exists As Boolean

Exists = oFSO.FolderExists("c:\folder")

End Sub

то есть в If напиши
Код
...
If(oFSO.FolderExists("c:\folder")) Then...

Не забудь подключить scrrun.dll к проекту.

Автор: korob2001 27.9.2004, 13:03
Большое спасибо.
Сейчас отпринтую и пойду домой пробовать.

Автор: korob2001 28.9.2004, 23:53
To cardinal
Не могу найти scrrun.dll sad.gif Подскажи пожалуйста как его подключить к проекту, потому что мне кажется это то, что нужно. Пробовал искать в списке, ой не помню как называется, но зато помню как вызывал его <Ctrl + T>. Но в нём его не нашёл, может нужно было в другом месте поискать?

To boevik
Такой код вроде подошёл, но затем возникла проблема.
Вобщем, тренировки ради написал такую прогу.
GUI:
5 текстовых полей, для ввода 5 имён txtName(1), txtName(2) ..... txtName(5)
5 текстовых полей, для ввода 5 фамилий txtFamily(1), txtFamily(2) ... txtFamily(5)
1 List box - lstMem для ввода данных из файла.
2 кнопки "Save to file" - cmdSave
"Exit" - cmdExit

Начальные параметры
Все текстовые поля пустые.

Код
Код

Private arrName(4) As String, arrFamily(4) As String
Private arrFullName(4) As String
Option Explicit

Private Sub cmdExit_Click()
       Unload frmMain
       End
End Sub

Private Sub cmdSave_Click()
       Dim intI As Integer
       Dim fileName As String, dirName As String
       fileName = "base.txt"
       dirName = "C:\Base"
       For intI = 0 To 4
           arrName(intI) = Trim(txtName(intI).Text)
           arrFamily(intI) = Trim(txtFamily(intI).Text)
           arrFullName(intI) = arrName(intI) & Space(1) & arrFamily(intI)
       Next
       Call saveToFile(fileName, dirName)
       For intI = 0 To 4
           txtName(intI).Text = ""
           txtFamily(intI).Text = ""
       Next
       Call showFromFile(fileName, dirName)
End Sub

Sub saveToFile(fileName As String, dirName As String)
   Dim numFile As Integer, intI As Integer, workDir As String
   workDir = CurDir
   If Len(Dir(dirName)) = 0 Then MkDir (dirName) ' Эта проверка работает
   ChDir (dirName)
   numFile = FreeFile
   Open fileName For Append As numFile
        For intI = 0 To 4
            Print #numFile, arrFullName(intI)
        Next
   Close numFile
   ChDir (workDir)
   MsgBox "All names successfuly saved in this file: " _
                & dirName & "\" & fileName
End Sub

Private Sub Form_Load()
       Dim fileName As String, dirName As String
       dirName = "C:\Base"
       fileName = "base.txt"
       Call showFromFile(fileName, dirName)
End Sub

Sub showFromFile(fileName As String, dirName As String)
   Dim numFile As Integer
   Dim workDir As String, strFromFile As String
   If Len(Dir(dirName)) <> 0 Then        ' А эта проверка не работает
      workDir = CurDir
      numFile = FreeFile
      ChDir (dirName)
      Open fileName For Input As numFile
           Do Until EOF(numFile)
              strFromFile = ""
              Line Input #numFile, strFromFile
              Trim (strFromFile)
              lstMem.AddItem strFromFile
           Loop
      Close (numFile)
      ChDir (workDir)
   End If
End Sub

Я конечно понимаю что вторая проверка в данном случае не уместна. Но я ведь только начал. Что знаю, то и поробую. Вобщем я пытаюсь, проверить существует каталог или нет для того, что бы не выводилась ошибка Path not found, при попытке открыть для чтения не существующий файл. В моём случае если существует каталог, то значит существует и файл. Можно конечно сделать проверку на существование файла, но я не знаю как.
Или может я не допонимаю сути этой строки:
Код

If Len(Dir(dirName)) <> 0 Then

Вот как я её понимаю:
Функция Len получает имя каталога из функции Dir, в то время функции Dir передаём путь к каталогу. В конечном итоге функция Len возвращает кол-во сиволов из которых состоит имя каталога. Если длина имени каталога не равна 0, значит каталог существует.

Может, я не совсем верно мыслю? Подправьте. Если не трудно, подскажите как проверить файл на существование. Так как если убрать это условие, то всё прекрастно работает.

Извините за ламерские вопросы, просто Visual Basic учу только вторую неделю.

Заранее благодарен за помощь и понимание. qstn.gif
Денис

Автор: -Mikle- 29.9.2004, 08:01
Цитата(korob2001 @ 29.9.2004, 03:53)
If Len(Dir(dirName)) <> 0 Then        ' А эта проверка не работает

Цитата(korob2001 @ 29.9.2004, 03:53)
что бы не выводилась ошибка Path not found, при попытке открыть для чтения не существующий файл.

В данном случае она проверяет существование не файла, а каталога, но самого файла может и не быть... может в таком случае она у тебя не работает? т.е. когда каталог есть, а файла нет? в случае когда нужно проверить еще и существование файла, то ф-ии надо передать еще и его:
Код
if len(dir("c:\folder1\bbb.txt"))<>0 then
  ' выполнится если файл в указанном каталоге есть.
end if

я всегда так проверяю файлы smile.gif

Цитата(korob2001 @ 29.9.2004, 03:53)
Не могу найти scrrun.dll  Подскажи пожалуйста как его подключить к проекту, потому что мне кажется это то, что нужно. Пробовал искать в списке, ой не помню как называется, но зато помню как вызывал его <Ctrl + T>. Но в нём его не нашёл, может нужно было в другом месте поискать?

<Ctrl + T> - это список доступных компонентов
Тебе нужно в меню Project -> References... найти Microsoft Scripting Runtime и отметить его.

и еще, на данный момент это не важно, но все же позволь:
Код
sFullFileName = "c:\path1\path2\ttt.txt"  'полный путь к файлу
'ищем  слэш  начиная с конца, в переменной будет записано позиция символа
p = inStrRev(sFullFileName, "\")
sPath = left$(sFullFileName, p-1) 'берем слева строки p-1 символов
sFile = mid$(sFullFileName, p+1) 'берем из строки все символы до конца, начиная с символа p+1
это я к тому, чтоб как можно меньше параметров передавать ф-ии, хотя, в большинстве случаев разбивка на путь и имя_файла не требуется...

Цитата
Извините за ламерские вопросы, просто Visual Basic учу только вторую неделю.

Заходи, не стесняйся! Удачи! smile.gif

PS: Кстати, я наоборот, только начал изучать Perl smile.gif

Автор: cardinal 29.9.2004, 08:36
Цитата(korob2001 @ 28.9.2004, 22:53)
Извините за ламерские вопросы, просто Visual Basic учу только вторую неделю.

Если бы ты знал, что я несколько лет назад спрашивал (тут на форуме недавно увидел), то вообще ухахочишься... smile.gif

Автор: korob2001 29.9.2004, 13:10
Все понял, а это куда важнее чем тупо копировать чужие труды. БОЛЬШОЕ СПАСИБО. smile.gif

Цитата

Кстати, я наоборот, только начал изучать Perl

Удачи тебе, я не пожалел что освол его. Может когда-нибудь тебе понадобится и моя помощь, с удовольствием помогу.
Цитата

Если бы ты знал, что я несколько лет назад спрашивал (тут на форуме недавно увидел), то вообще ухахочишься...

Я с этим знаком, сейчас смотрю на свои первые вопросы по Perl и улыбаюсь. smile.gif

Еще раз всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)