Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: существует или нет? Добавлено: 11.02.04 08:42  

Автор вопроса:  =]sashOK[=

I'm sorry - ентер случайно нажал

Вопрос:

как узнать существует или нет файл по известному пути не используя scrrun.dll (FileSystemObject)?

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #1
Добавлено: 11.02.04 09:36

Функция Dir

if len(dir(path_to_file))>0 then msgbox "file is exists"

Ответить

Номер ответа: 2
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #2 Добавлено: 11.02.04 09:57

Я обычно делаю так:

If Dir(Path) <> "" Then ...

...ну и так далее.

Ответить

Номер ответа: 3
Автор ответа:
 User Unknown



Вечный Юзер!

ICQ: uu@jabber.cz 

Вопросов: 120
Ответов: 3302
 Профиль | | #3 Добавлено: 11.02.04 10:04

ИМХО, у boevik'а быстрее код. Так как у него не создается временной переменной типа String. И вообще проверять string на пустоту лучше через len, нежели через пустую переменную "".

Ответить

Номер ответа: 4
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #4
Добавлено: 11.02.04 18:58

2UU:

извини не за грубость, но ты не много обламался:

вот код для 6, кинь на форму тве кнопки:

Private Sub Command1_Click()

s = Timer

For i = 1 To 10000

If Len(Dir(p$)) > 0 Then Me.Caption = "file is exists"

Next i

MsgBox Timer - s

End Sub

Private Sub Command2_Click()

s = Timer

For i = 1 To 10000

If Dir(p$) = "" Then Me.Caption = "file is exists"

Next i

MsgBox Timer - s

End Sub

Первый тест - 14.5 сек

Втрой - 1.1 сек

ИМХО разница очевидна

ЗЫ просто хотелось провести тест

Ответить

Номер ответа: 5
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #5
Добавлено: 11.02.04 20:36

 NeForm@t , извини, но у тебя ГРУБЕЙШАЯ ошибка в коде.

давай разберем, что пройсходит в кнопке 1, если Dir впзвращает что либо, то Len(Dir(p$)) > 0 возвращает True и происходит действие Me.Caption = "file is exists"

что пройсходит в кнопке 2, если Dir впзвращает что либо, то  Dir(p$) = "" возвращает False и НЕ происходит действие Me.Caption = "file is exists".

Остается добавить что Dir(p$), когда p$ пусто, возвращает первый попавшийся файл.

Твой тест не был сделан на равных условиях.

Измени строку условия во второй кнопке на

If Dir(p$) <> "" Then Me.Caption = "file is exists", и замерь время.

И еще сделай тест с инициализацией p$.

Ответить

Номер ответа: 6
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #6
Добавлено: 11.02.04 22:33

Нет, 1-й код он даже по самой идее - быстрее, а для измерений не следует применять Timer... она неверно бывает отображает время... Пользуем - GetTickCount

Ответить

Номер ответа: 7
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #7
Добавлено: 11.02.04 23:41

Да, я действительно допустил ошибку.

Но я ессно испрвамил, вот новый листинг:

Dim p As String

Dim s As Long

Dim i As Integer

Dim a As Integer

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 10000

If Len(Dir(p)) > 0 Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

Private Sub Command2_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 10000

If Dir(p) <> "" Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

Результаты тестов:

1 - 625

2 - 620

это средние значения

они всё время разные:

I

1 - 735

2 - 703

II

1 - 703

2 - 719

III

1 - 735

2 - 687

но, приемущественно всё равно выигрывает второй код

Ответить

Номер ответа: 8
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 12.02.04 00:21

Странно... по всем идеям должно быть не так ;) ... Интересно...

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 12.02.04 02:16
Почти никакого прироста. Вот уж действительно, я и сам этому верил что LEN быстрее чем "". А проверить не догадался.

Ответить

Номер ответа: 10
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #10
Добавлено: 12.02.04 19:19

Len не должен быть быстрее, ведь это только лишний вызов функции, а там везде используется variant, как я понял, поэтому и из-за проверки целого прироста производительности не происходит. Да и вообще, Dir - не есть хорошо - существует много более быстрых способов, SHFileExist (кажется так) или CreateFile...

Ответить

Номер ответа: 11
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #11
Добавлено: 13.02.04 00:27

Люди, меня поразили результаты тестов с FSO!!

Вот листинг:

'незабудьте ссылку на фсо проставить

Dim p As String

Dim s As Long

Dim i As Long

Dim a As Long

Dim fso As New FileSystemObject

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 100000

If Len(Dir(p)) > 0 Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

Private Sub Command2_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 100000

If fso.FolderExists(p) = True Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

результаты:

1 - 6860

2 - 1515!!!!

вот FSO рулит!

Ответить

Номер ответа: 12
Автор ответа:
 NeForm@t



ICQ: 252999255 

Вопросов: 36
Ответов: 247
 Web-сайт: g--k.newmail.ru
 Профиль | | #12
Добавлено: 13.02.04 00:40

А тут финал - FSO рулит перед API!!!!:

Листинг:

'3 кнопки и ссылка на FSO

Dim p As String

Dim s As Long

Dim i As Long

Dim a As Long

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Dim fso As New FileSystemObject

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 100000

If Len(Dir(p)) > 0 Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

Private Sub Command2_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 100000

If fso.FolderExists(p) = True Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

Private Sub Command3_Click()

a = 0

p = "c:\"

s = GetTickCount

For i = 1 To 100000

If PathFileExists(p) = 1 Then

a = a + 1

End If

Next i

MsgBox GetTickCount - s

MsgBox a

End Sub

Результаты:

1-8078

2-1688!!!

3-2469

ик =)

Ответить

Номер ответа: 13
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #13
Добавлено: 13.02.04 01:23

Да это все в большей степени от оптимитзации зависит... Вот что мы видим...

Не изменяя код:
1. 6440
2. 0751
3. 982

А теперь возьмем не существующую папку... Я брал F:\NewFolder. Результаты уже не так сильно различаются:
1. 2133
2. 1022
3. 1322

Теперь берем папку существующую, но не очевидную, как "с:\":
1. 8873
2. 0841
3. 1132

При этом не стоит забывать что в первом случае используется функция не одна функция и что Dir не просто возвращает 1/0, в зависимости от существования файла, она еще и возвращает имя первого файла в папке, да и к тому же "запоминает" путь... т.к. получение последующих файлов осуществляется простым ее вызовом, без параметров... Да, и еще Dir - работает с атрибутами файлов... Отсюда и результаты...

Не смотря на выводы, я все равно останусь приверженцем АПИ, т.к. на мой взгляд это более удобно, правильно, не требуется доп. подключения библиотек...

Ответить

Номер ответа: 14
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #14
Добавлено: 13.02.04 01:35

NetFormat, проведи уж за одно и тест с CreateFile, там флаг имеется специальный, посмотрим как она себя поведет...

Ответить

Номер ответа: 15
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #15
Добавлено: 13.02.04 01:45

Ой, очепятался, OpenFile... Вот что у меня: Опять как и в предыдущем случае провел три различных теста, получил:
1. 1973
2. 1552
3. 2223

Вызов функции: OpenFile(p, 0&, &H4000)

Декларация: Private Declare Function OpenFile Lib "kernel32.dll" (ByVal lpFileName As String, lpReOpenBuff As Long, ByVal wStyle As Long) As Long

Вот такие не утишительные результаты...
ЗЫ
Для тестирования брался цикл в 100000

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам