Vb net существует ли файл

Обновлено: 03.07.2024

    Text1.Text = Environ("windir")' вот и все!

    Копирование, перемещение, переименование, запуск, файлов в Visual Basic

Сейчас мы разберем одну из простейших тем в программенге,но тем не менее вызывающею затруднение у многих начинающих программеров. Я расскажу о том, как работать с фалами вообще( копировать, удалять и тд.), работать с Аски(текстовыми) файлами ( чтение, запись файла). Начнем. Как не странно но для работы с обычными файлами нам будет достаточно всего 2 оператора : filecopy и kill

Копируем файл: допустим у нас есть один файлик с именем 1.txt в папке C:\1\ , а нам нужно скопировать его в C:\2\ . Все просто, пишем следующие:
Filecopy "C:\1\1.txt","C:\2\1.txt"
(*Внимание! Если в каталоге 2 уже находиться файлик с именем 1.txt , то он будет заменен на 1.txt из каталога 1 . )

Удаляем файл с диска:
Например мы хотим удалить файл 1.txt из корневой диска C:
Пишем:
Kill ("C:\1.txt")

Перемещаем файл: для этого мы используем два оператора сразу. Например нам нужно переместить файл 1.txt из C:\ в C:\2\ . Пишем:
Filecopy "C:\1.txt","C:\2\1.txt"
Kill ("C:\1.txt")

Переименовываем файл:
Надо переименовать файл 1.txt находящийся в C:\ на 2.txt .
Пишем:
Filecopy "C:\1.txt","C:\2.txt"
Kill ("C:\1.txt")

Устанавливаем атрибуты файла(скрытый, только для чтения и тд.): Для этого используем оператор setattr.
Пишем:
Setattr "C:\1.txt" , vbHidden - теперь файл 1.txt стал скрытым.
Чтобы изменить сразу несколько параметров нужно ставить "+" между каждым значением:
Setattr "C:\1.txt",vbHidden+vbReadOnly -Теперь файл скрытый и только для чтения.

Открыть любой файл, директорию - Visual Basic
' Под Windos NT:
Shell "cmd /X /C start c:\mydoc\example.doc"
' Под Windos 9x:
Shell "start c:\mydoc\example.doc"
' через API
' добавляем в модуль
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub Command1_Click()
ShellExecute 0, vbNullString, "C:\" & sFile, vbNullString, vbNullString, vbNormalFocus
End Su

Существует ли файл? - Visual Basic
'1. Возвращает 1(файл существует) или 0 (файла нет)

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
MsgBox PathFileExists("c:\autoexec.bat")

'2. Возвращает True(файл существует) или False(файла нет)

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Public Function DoesFileExist(ByVal strPath As String) As Boolean
DoesFileExist = PathFileExists(strPath)
End Function
MsgBox DoesFileExist("c:\autoexec.bat")

Получить размер файла - Visual Basic
Размер файла можно определить двумя путями:

1. Если файл можно открыть функцией OPEN, то можно воспользоваться функцией LOF

Dim FileFree As Integer
Dim FileSize As Long
FileFree = FreeFile
Open "C:\WIN\GENERAL.TXT" For Input As FileFree
FileSize = LOF(FileFree)
Close FileFree

2. Используя функцию FileLen

Dim lFileSize As Long
FileSize = FileLen("C:\WIN\GENERAL.TXT")

Как получить имя файла или его расширение, зная полный путь файлау - Visual Basic
Private Function Spliting(sFullPath As String, point As String)
Dim str1() As String
str1 = Split(sFullPath, point)
Spliting = str1(UBound(str1))
End Function

Удаление файла в корзину - Visual Basic
Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As Long
End Type
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const FOF_SILENT = &H4

Sub SendFileToRecycleBin(FileName As String, Optional Confirm As Boolean = True, Optional Silent As Boolean = False)
Dim FileOp As SHFILEOPSTRUCT
With FileOp
.wFunc = FO_DELETE
.pFrom = FileName
.fFlags = FOF_ALLOWUNDO
If Not Confirm Then .fFlags = .fFlags + FOF_NOCONFIRMATION
If Silent Then .fFlags = .fFlags + FOF_SILENT
End With
SHFileOperation FileOp
End Sub

Private Sub Command1_Click()
SendFileToRecycleBin "C:\1.txt", False
SendFileToRecycleBin "C:\11.txt", True
End Sub

Функция для изменения расширения файла - Visual Basic
Function ChangeFileExtension(FileName As String, Extension As String, Optional AddIfMissing As Boolean) As String
Dim i As Long
For i = Len(FileName) To 1 Step -1
Select Case Mid$(FileName, i, 1)
Case "."
ChangeFileExtension = Left$(FileName, i) & Extension
Exit Function
Case ":", "\"
Exit For
End Select
Next
If AddIfMissing Then
ChangeFileExtension = FileName & "." & Extension
Else
ChangeFileExtension = FileName
End If
End Function

Private Sub Command1_Click()
MsgBox ChangeFileExtension("ggg.htm", "txt")
MsgBox ChangeFileExtension("ggg", "txt", True)
End Sub

Хотите знать, какие файлы скопированы в память? - Visual Basic

Добавьте на форму элемент CommandButton и ListBox.
Вставьте код, запустите. Затем переключитесь в Проводник, выберите несколько файлов, скопируйте их.
Затем перейдите в вашу программу и нажмите на кнопку.

Private Const CF_HDROP = 15
Private Type POINT
x As Long
y As Long
End Type
Private Type DROPFILES
pFiles As Long
pt As POINT
fNC As Long
fWide As Long
End Type
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub ShowFilesOnClipboard()
Dim lHandle As Long
Dim lpResults As Long
Dim lRet As Long
Dim df As DROPFILES
Dim strDest As String
Dim lBufferSize As Long
Dim arBuffer() As Byte
Dim vNames As Variant
Dim i As Long

If OpenClipboard(0) Then
lHandle = GetClipboardData(CF_HDROP)
' If you don't find a CF_HDROP, you don't want to process anything
If lHandle > 0 Then
lpResults = GlobalLock(lHandle)

lBufferSize = GlobalSize(lpResults)
ReDim arBuffer(0 To lBufferSize)

CopyMemory df, ByVal lpResults, Len(df)
Call CopyMemory(arBuffer(0), ByVal lpResults + df.pFiles, (lBufferSize - Len(df)))

If df.fWide = 1 Then
' it is wide chars--unicode
strDest = arBuffer
Else
strDest = StrConv(arBuffer, vbUnicode)
End If
GlobalUnlock lHandle
vNames = Split(strDest, vbNullChar)
i = 0
While Len(vNames(i)) > 0
List1.AddItem vNames(i)
i = i + 1
Wend
End If
End If
CloseClipboard
End Sub

4.2 Создание директории - Visual Basic
Sub MakeDir(dirname As String)
Dim i As Long, path As String
Do
i = InStr(i + 1, dirname & "\", "\")
path = Left$(dirname, i - 1)
If Right$(path, 1) <> ":" And Dir$(path, vbDirectory) = "" Then
MkDir path
End If
Loop Until i >= Len(dirname)
End Sub

Private Sub Command1_Click()
Call MakeDir("C:\Aleks_Soft\1\2\3\")
End Sub

4.3 Выводим список всех папок с подпапками - Visual Basic
На форму кинем 2 текстовых поля и кнопку, имя первого текстового поля: StartText, имя второго текстового поля OutText и сделай свойство Multiline=true, имя кнопки: CmdStart
Далее пишим код в кнопке:

Static running As Boolean
Dim AllDirs As New Collection
Dim next_dir As Integer
Dim dir_name As String
Dim sub_dir As String
Dim i As Integer
Dim txt As String
If running Then
running = False
CmdStart.Enabled = False
CmdStart.Caption = "Stopping"
Else
running = True
MousePointer = vbHourglass
CmdStart.Caption = "Stop"
OutText.Text = ""
DoEvents
next_dir = 1
AllDirs.Add StartText.Text
Do While next_dir <= AllDirs.Count
dir_name = AllDirs(next_dir)
next_dir = next_dir + 1
sub_dir = Dir$(dir_name & "\*", vbDirectory)
Do While sub_dir <> ""
If UCase$(sub_dir) <> "PAGEFILE.SYS" And sub_dir <> "." And sub_dir <> ".." Then
sub_dir = dir_name & "\" & sub_dir
On Error Resume Next
If GetAttr(sub_dir) And vbDirectory Then AllDirs.Add sub_dir
End If
sub_dir = Dir$(, vbDirectory)
Loop
DoEvents
If Not running Then Exit Do
Loop
txt = ""
For i = 1 To AllDirs.Count
txt = txt & AllDirs(i) & vbCrLf
Next i
OutText.Text = txt
MousePointer = vbDefault
unning = False
End If

Теперь запустим прогу, в текстовом поле StartText пишим: C:\windows, и жмем на кнопку и ждем.

4.4 Как показать стандартный диалог выбора каталога? - Visual Basic
Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As String
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Dim strPath As String
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Public Function BrowseForFolder(hwndOwner As Long, sPrompt As String) As String
Const BIF_RETURNONLYFSDIRS = 1, MAX_PATH = 260
Dim intNull As Integer, lngIdList As Long
Dim udtBI As BrowseInfo

With udtBI
.hwndOwner = hwndOwner
.lpszTitle = sPrompt
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lngIdList = SHBrowseForFolder(udtBI)
If lngIdList Then
strPath = String$(MAX_PATH, 0)
SHGetPathFromIDList lngIdList, strPath
CoTaskMemFree lngIdList
intNull = InStr(strPath, vbNullChar)
If intNull Then strPath = Left$(strPath, intNull - 1)
End If
BrowseForFolder = strPath
End Function

Private Sub Command1_Click()
BrowseForFolder Me.hWnd, "Hi, Select . "
Print strPath
End Sub

4.5 Создание многоуровневых каталогов - Visual Basic
Иногда приходится анализировать наличие указанного каталога (к примеру, при установке вашей программы на жесткий диск) и создавать новый при его отсутствия. Для этого можно использовать, например, такую процедуру:

Sub CreateLongDir(sDir As String)
Dim sBuild As String, sDirTmp As String, i As Integer
'
sDirTmp = sDir & "\"
i = InStr (sDirTmp, ":")
If i > 0 Then ' задано имя диска
sBuild = Left$(sDirTmp, i) ' имя текущего каталога
sDirTmp = Mid$(sDirTmp, i + 1)
Else
sBuild = "" ' имя текущего каталога
End If
Do ' проверка-создание вложенных каталогов
i = InStr (2, sDirTmp, "\")
If i = 0 Then Exit Do
sBuild = sBuild & Left$(sDir, i - 1)
sDirTmp = Mid$(sDirTmp, i)
If Dir$(sBuild, 16) = "" Then 'нет такого каталога
MkDir sBuild ' создание каталога
End If
Loop
End Sub

Sub Test () ' примеры обращения
' полное имя каталога с именем диска
Call CreateLongDir("C:\Tests\TestDir\NewDir")
' полное имя каталога в текущем диске
Call CreateLongDir("\Current\TestDir\NewDir")
' имя нового каталога относительно текущего каталога
Call CreateLongDir("Current\TestDir\NewDir")
End Sub

Здесь крайне важно дать правильное описание имени каталога при обращении к CreateLongDir (в соответствии с правилами обращения к функциям VB: MkDir, ChDir, RmDir, Dir):

4.6 Как проверить, существует ли директория? - Visual Basic?
Иногда необходимо проверить, существует ли папка. Данная функция возвращает True - если папка существует, и False - если такой папки на компьютере нет. В данную функцию передается строковая переменная, содержащая полный путь к директории(папке).

Public Function FolderExists(ByVal strPathName As String) As Boolean
Dim DirectoryFound As String
Const errPathNotFound As Integer = 76
On Error GoTo 0
DirectoryFound = Dir(strPathName, vbDirectory)
If (Len(DirectoryFound) = 0 Or Err = errPathNotFound) Then
FolderExists = False
Else
FolderExists = True
End If
End Function
Private Sub Command1_Click()
'MsgBox FolderExists("D:\Basic")
If FolderExists("D:\Basic\Module1") = False Then
MsgBox "Такая папка не существует"
Else
MsgBox "Такая папка существует"
End If
End Sub

4.7 Получить размер директории - Visual Basic
Const MAX_PATH = 260
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As
WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA)
As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Public Function SizeOf(ByVal DirPath As String) As Double
Dim hFind As Long
Dim fdata As WIN32_FIND_DATA
Dim dblSize As Double
Dim sName As String
Dim x As Long
On Error Resume Next
x = GetAttr(DirPath)
If Err Then SizeOf = 0: Exit Function
If (x And vbDirectory) = vbDirectory Then
dblSize = 0
Err.Clear
sName = Dir$(EndSlash(DirPath) & "*.*", vbSystem Or vbHidden Or vbDirectory)
If Err.Number = 0 Then
hFind = FindFirstFile(EndSlash(DirPath) & "*.*", fdata)
If hFind = 0 Then Exit Function
Do
If (fdata.dwFileAttributes And vbDirectory) = vbDirectory Then
sName = Left$(fdata.cFileName, InStr(fdata.cFileName, vbNullChar) - 1)
If sName <> "." And sName <> ".." Then
dblSize = dblSize + SizeOf(EndSlash(DirPath) & sName)
End If
Else
dblSize = dblSize + fdata.nFileSizeHigh * 65536 + fdata.nFileSizeLow
End If
DoEvents
Loop While FindNextFile(hFind, fdata) <> 0
hFind = FindClose(hFind)
End If
Else
On Error Resume Next
dblSize = FileLen(DirPath)
End If
SizeOf = dblSize
End Function
Private Function EndSlash(ByVal PathIn As String) As String
If Right$(PathIn, 1) = "\" Then
EndSlash = PathIn
Else
EndSlash = PathIn & "\"
End If
End Function

Private Sub Form_Load()
'Замените 'D:\Basic' той директорией, размер которой хотите узнать
MsgBox SizeOf("D:\Basic") / 1000000
End Sub

4.8 Определить, имеет ли папка подпапки - Visual Basic Private Const MAX_PATH = 260
Private Type SHFILEINFO
hIcon As Long
iIcon As Long
dwAttributes As Long
szDisplayName As String * MAX_PATH
szTypeName As String * 80
End Type
Private Declare Function SHGetFileInfo Lib "Shell32" Alias "SHGetFileInfoA" (ByVal pszPath As Any, ByVal dwFileAttributes As Long, psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long) As Long

Function FolderHasSubFolders(ByVal sPath As String) As Boolean
Const SFGAO_HASSUBFOLDER = &H80000000
Const SHGFI_ATTRIBUTES = &H800
Dim FInfo As SHFILEINFO
SHGetFileInfo sPath, 0, FInfo, Len(FInfo), SHGFI_ATTRIBUTES
FolderHasSubFolders = (FInfo.dwAttributes And SFGAO_HASSUBFOLDER)
End Function

Private Sub Command1_Click()
MsgBox FolderHasSubFolders("C:\Program Files")
MsgBox FolderHasSubFolders("C:\Program Files\NetMeeting")
End Sub

vbStr » 19.07.2005 (Вт) 21:00

Как определить: существует ли по определенному пути файл с некоторым именем? Можно ли решить эту проблему, не прибегая к обработке ошибки? Спасибо.

vbskb_file vbskb_exists vbskb_fileexists

tyomitch » 19.07.2005 (Вт) 23:09

Изображение

Leo. » 20.07.2005 (Ср) 18:59

Нет ничего невозможного, но возможное тожэ огграничена и при этом нестоит забывать что свои вазможнасти человек ограничивает сам!

Ruslan Demidow » 21.07.2005 (Чт) 8:00

GSerg » 21.07.2005 (Чт) 8:09

Потому что файл могут удалить после того, как условие проверено, но до того, как начала выполняться ветка. Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow » 21.07.2005 (Чт) 10:08

GSerg писал(а): Потому что файл могут удалить после того, как условие проверено, но до того, как начала выполняться ветка.

GSerg » 21.07.2005 (Чт) 10:19

Тады ловить ошибку, это единственно правильный способ. Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow » 21.07.2005 (Чт) 16:13

GSerg писал(а): Тады ловить ошибку, это единственно правильный способ.

GSerg » 21.07.2005 (Чт) 16:32

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gfif21 » 21.07.2005 (Чт) 16:42

Вот в книжице нашел примерчик:

GSerg » 21.07.2005 (Чт) 16:43

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gfif21 » 21.07.2005 (Чт) 16:48

tyomitch » 21.07.2005 (Чт) 19:20

GSerg писал(а): Потому что файл могут удалить после того, как условие проверено, но до того, как начала выполняться ветка.
Вообще-то я об этом даже не подумал
Мой код (тот же самый, что в книжице Gfif21) неправильный потому, что если в Dir передать мусор, то он вернёт ошибку 52 "Bad file name or number", и её всё равно придётся отлавливать.
Но ты указал гораздо более серьёзный недостаток этого кода.

Изображение

extHack » 22.07.2005 (Пт) 17:00

if dir$("c:\windows\system32\ntoskrnl.exe") <> "" then
'Файл существует
else
'Не существует
end if

vbStr » 22.07.2005 (Пт) 17:02

Всем спасибо! Я так понял: без отлавливания ошибки не обойтись!

GSerg » 22.07.2005 (Пт) 17:22

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow » 22.07.2005 (Пт) 21:34

GSerg, покажи, плиз, пример реализации "правильного" кода. Что-то я не допру: как можно через дир проверить наличие файла и одновременно отловить ошибку.
Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.

VVitafresh » 23.07.2005 (Сб) 0:15

Можно так проверять:
Код: Выделить всё
Public Function bFileExists(sFile As String) As Boolean
'Проверка наличия файла.
'Подключить References -> Microsoft Scripting Runtime
Dim f As New Scripting.FileSystemObject
If f.FileExists(sFile) = True Then
bFileExists = True
Else
bFileExists = False
End If
End Function

To GSerg:
Если делать эту проверку сразу перед использованием файла, то вероятность того, что файл удалят раньше, чем он обработается в ветке будет очень маленькой. Хотя, конечно, стандартный ErrorHandler не помешает никогда.

FaKk2 » 23.07.2005 (Сб) 2:06

Ты делаешь ставку на удачу. А GSerg делает наверняка.

Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

GSerg » 23.07.2005 (Сб) 3:44

Ruslan Demidow писал(а): Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.
Нет.
Если ты проверяешь наличие файла, значит, ты хочешь с ним что-то сделать. Вот сразу делай, без проверки наличия, и лови ошибку. Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow » 23.07.2005 (Сб) 8:35

Ruslan Demidow писал(а): Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.
Нет.
Если ты проверяешь наличие файла, значит, ты хочешь с ним что-то сделать. Вот сразу делай, без проверки наличия, и лови ошибку.
А если мне в моей программе при загрузке нужно проверить наличие файла указанного в настройках, а использовать его потом (в зависимости от наличия файла). Всё равно писать обработчик?

Viper » 23.07.2005 (Сб) 9:06

Наличие файла надо проверять каждый раз при его использовании. Т.е. если надо проверить наличие указанного при загрузке файла, проверяй. Когда позже начинаешь с ним работать - проверяй. и так далее.

а самая надежная проверка - отлов ошибки.

Ruslan Demidow , Привет земляку!

Ruslan Demidow » 23.07.2005 (Сб) 10:11

!Viper! писал(а): Наличие файла надо проверять каждый раз при его использовании. Т.е. если надо проверить наличие указанного при загрузке файла, проверяй. Когда позже начинаешь с ним работать - проверяй. и так далее.

В принципе я так и делаю. У меня Public функция которая на входе получает имя файла и на выходе возвращает True/False в зависимости от наличия файла. Перед использованием вызываю её, и после этого сразу же идёт проверка результата этой функции. А там уже по обстоятельствам.

!Viper! писал(а): а самая надежная проверка - отлов ошибки.

Если в каждой процедуре или функции писать одни и те же строки проверки ошибки - это получается нерационально. В моём случае - эти строки вынесены в общедоступную функцию.
Как ещё можно отлавливать ошибки при доступе к файлу - мне представляется с трудом. Имхо, лучше проверить на наличие перед использованием, чем столкнуться с ошибкой во время использования (или в начале использования), там где и не расчитываешь на ошибку.

Читайте также: