Imports System.IO
Imports System.IO.Compression
Public Class FileOperate
''' <summary>
''' 指定したフォルダ下に、ファイルを圧縮する
''' </summary>
''' <param name="sourceFileFolderPath"></param>
''' <param name="targetFileFolderPath"></param>
''' <param name="zipFileName"></param>
''' <remarks></remarks>
Public Shared Sub ZipFileToDirectory(ByVal sourceFileFolderPath As String, ByVal targetFileFolderPath As String, ByVal zipFileName As String)
ZipFile.CreateFromDirectory(sourceFileFolderPath, targetFileFolderPath & zipFileName, CompressionLevel.Fastest, False)
End Sub
''' <summary>
''' ZIPファイルを指定したフォルダ下に解凍する
''' </summary>
''' <param name="zipFilePath"></param>
''' <param name="extractFilePath"></param>
''' <remarks></remarks>
Public Shared Sub ExtractZipFileToDirectory(ByVal zipFilePath As String, ByVal extractFilePath As String)
ZipFile.ExtractToDirectory(zipFilePath, extractFilePath)
End Sub
''' <summary>
''' 指定したフォルダ下に、ファイル有無の判断
''' </summary>
''' <param name="folderPath">指定したフォルダパル</param>
''' <returns>true:ファイル有る、false:ファイル無し</returns>
''' <remarks></remarks>
Public Shared Function IsExistsFileInFolder(ByVal folderPath As String) As Boolean
Dim fso = CreateObject("Scripting.FileSystemObject")
If fso.GetFolder(folderPath).Files.Count = 0 Then
'不存在
Return False
Else
'存在
Return True
End If
End Function
''' <summary>
''' 指定したフォルダ下のファイルを削除する
''' </summary>
''' <param name="deleteFileFolderPath"></param>
''' <param name="fileType">*.*(全て)/*.csv(csvファイルだけ)など</param>
''' <remarks></remarks>
Public Shared Sub DeleteAllFillInDirectory(ByVal deleteFileFolderPath As String, ByVal fileType As String)
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
deleteFileFolderPath, _
FileIO.SearchOption.SearchAllSubDirectories, _
fileType)
My.Computer.FileSystem.DeleteFile(foundFile, _
FileIO.UIOption.OnlyErrorDialogs, _
FileIO.RecycleOption.DeletePermanently)
Next
End Sub
''' <summary>
''' ファイルのコピー
''' </summary>
''' <param name="sourceFilePath">元ファイルパス</param>
''' <param name="targetFilePath">目標ファイルパス</param>
''' <remarks></remarks>
Public Shared Sub CopyFile(ByVal sourceFilePath As String, ByVal targetFilePath As String)
'\\コンピュータ名\共有名\(ディレクトリ名\)ファイル名
' 既に同名のファイルが存在していても上書きする場合
System.IO.File.Copy(sourceFilePath, targetFilePath, True)
End Sub
''' <summary>
''' フォルダ下のファイル全てコピーする
''' </summary>
''' <param name="sourceFolderPath"></param>
''' <param name="targetFolderPath"></param>
''' <remarks></remarks>
Public Shared Sub CopyAllFiles(ByVal sourceFolderPath As String, ByVal targetFolderPath As String)
My.Computer.FileSystem.CopyDirectory(sourceFolderPath, targetFolderPath, True)
End Sub
''' <summary>
''' ファイルの移動
''' </summary>
''' <param name="sourceFolderPath"></param>
''' <param name="targetFolderPath"></param>
''' <remarks></remarks>
Public Shared Sub MoveAllFiles(ByVal sourceFolderPath As String, ByVal targetFolderPath As String)
My.Computer.FileSystem.CopyDirectory(sourceFolderPath, targetFolderPath, True)
DeleteAllFillInDirectory(sourceFolderPath, "*.csv")
End Sub
''' <summary>
''' フォルダサイズの取得
''' </summary>
''' <param name="dirInfo"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetDirectorySize( _
ByVal dirInfo As DirectoryInfo) As Long
Dim size As Long = 0
'フォルダ内の全ファイルの合計サイズを計算する
Dim fi As FileInfo
For Each fi In dirInfo.GetFiles()
size += fi.Length
Next fi
'サブフォルダのサイズを合計していく
Dim di As DirectoryInfo
For Each di In dirInfo.GetDirectories()
size += GetDirectorySize(di)
Next di
'結果を返す
Return size
End Function
''' <summary>
''' フォルダ内、最新のファイル名を取得する
''' </summary>
''' <param name="targetFolderPath"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetLatestFileName(ByVal targetFolderPath As String)
Dim fso, fol, fc, f1, f2
fso = CreateObject("Scripting.FileSystemObject")
fol = fso.GetFolder(targetFolderPath)
fc = fol.Files
For Each f1 In fc
If f2 Is Nothing Then
f2 = fso.GetFile(f1)
End If
If f1.DateLastModified > f2.DateLastModified Then
f2 = fso.GetFile(f1)
End If
Next
Return f2.Name
End Function
''' <summary>
''' CSVファイルの先頭行を削除する
''' </summary>
''' <param name="filePath"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function DeleteCSVHeader(ByVal filePath As String) As Boolean
Try
'ファイルを読み込みで開く
Dim sr As New System.IO.StreamReader(filePath, System.Text.Encoding.GetEncoding("shift_jis"))
'一時ファイルを作成する
Dim tmpPath As String = System.IO.Path.GetTempFileName()
'一時ファイルを書き込みで開く
Dim sw As New System.IO.StreamWriter(tmpPath, False, System.Text.Encoding.GetEncoding("shift_jis"))
Dim isFirstLine As Boolean = True
'内容を一行ずつ読み込む
While sr.Peek() > -1
'一行読み込む
Dim line As String = sr.ReadLine()
'はじめの行であれば、飛ばす
If isFirstLine Then
isFirstLine = False
Continue While
End If
'一時ファイルに書き込む
sw.WriteLine(line)
End While
'閉じる
sr.Close()
sw.Close()
'一時ファイルと入れ替える
System.IO.File.Copy(tmpPath, filePath, True)
System.IO.File.Delete(tmpPath)
Return True
Catch ex As Exception
Return False
End Try
End Function
''' <summary>
''' ファイルとフォルダ操作権限有無の判断
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FileOrFolderIsReadOnly(ByVal path As String)
' ファイルやディレクトリの属性(群)を取得
Dim fas As System.IO.FileAttributes = System.IO.File.GetAttributes(path)
' 属性(群)の中に読み取り専用があるかどうかを確認(ビット演算)
Dim bReadOnly As Boolean = ((fas And System.IO.FileAttributes.ReadOnly) = System.IO.FileAttributes.ReadOnly)
Return bReadOnly
End Function
''' <summary>
''' ファイルがロック中かどうかの判断
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FileIsLocked(ByVal path As String)
Dim stream As FileStream = Nothing
Try
stream = New FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
stream.Close()
Catch ex As Exception
Return True
End Try
stream.Close()
Return False
End Function
''' <summary>
''' ファイル読み込み専用属性解除
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ReleaseReadAttr(ByVal path As String) As Boolean
Try
Dim fi As New System.IO.FileInfo(path)
'読み込み専用属性があるか調べる
If (fi.Attributes And System.IO.FileAttributes.ReadOnly) = System.IO.FileAttributes.ReadOnly Then
'読み取り専用属性を解除する
fi.IsReadOnly = False
End If
Return True
Catch ex As Exception
Return False
End Try
End Function
''' <summary>
''' ファイルのサイズを確認
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetFileSize(ByVal path As String)
Dim file As New System.IO.FileInfo(path)
Return file.Length
End Function
''' <summary>
''' ディレクトリアクセスチェック
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FolderAccessCheck(ByVal path As String) As Boolean
Try
'実行ユーザ名取得
Dim ident As System.Security.Principal.WindowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()
Dim princ As New System.Security.Principal.WindowsPrincipal(ident)
'ファイルアクセス権所持ユーザと比較
Dim security As System.Security.AccessControl.DirectorySecurity = Directory.GetAccessControl(path)
For Each rule As System.Security.AccessControl.FileSystemAccessRule In security.GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
If rule.IdentityReference.ToString = princ.Identity.Name Then
Return True
End If
Next
Return False
Catch ex As Exception
Return False
End Try
Return False
End Function
End Class
Imports System.IO.Compression
Public Class FileOperate
''' <summary>
''' 指定したフォルダ下に、ファイルを圧縮する
''' </summary>
''' <param name="sourceFileFolderPath"></param>
''' <param name="targetFileFolderPath"></param>
''' <param name="zipFileName"></param>
''' <remarks></remarks>
Public Shared Sub ZipFileToDirectory(ByVal sourceFileFolderPath As String, ByVal targetFileFolderPath As String, ByVal zipFileName As String)
ZipFile.CreateFromDirectory(sourceFileFolderPath, targetFileFolderPath & zipFileName, CompressionLevel.Fastest, False)
End Sub
''' <summary>
''' ZIPファイルを指定したフォルダ下に解凍する
''' </summary>
''' <param name="zipFilePath"></param>
''' <param name="extractFilePath"></param>
''' <remarks></remarks>
Public Shared Sub ExtractZipFileToDirectory(ByVal zipFilePath As String, ByVal extractFilePath As String)
ZipFile.ExtractToDirectory(zipFilePath, extractFilePath)
End Sub
''' <summary>
''' 指定したフォルダ下に、ファイル有無の判断
''' </summary>
''' <param name="folderPath">指定したフォルダパル</param>
''' <returns>true:ファイル有る、false:ファイル無し</returns>
''' <remarks></remarks>
Public Shared Function IsExistsFileInFolder(ByVal folderPath As String) As Boolean
Dim fso = CreateObject("Scripting.FileSystemObject")
If fso.GetFolder(folderPath).Files.Count = 0 Then
'不存在
Return False
Else
'存在
Return True
End If
End Function
''' <summary>
''' 指定したフォルダ下のファイルを削除する
''' </summary>
''' <param name="deleteFileFolderPath"></param>
''' <param name="fileType">*.*(全て)/*.csv(csvファイルだけ)など</param>
''' <remarks></remarks>
Public Shared Sub DeleteAllFillInDirectory(ByVal deleteFileFolderPath As String, ByVal fileType As String)
For Each foundFile As String In My.Computer.FileSystem.GetFiles( _
deleteFileFolderPath, _
FileIO.SearchOption.SearchAllSubDirectories, _
fileType)
My.Computer.FileSystem.DeleteFile(foundFile, _
FileIO.UIOption.OnlyErrorDialogs, _
FileIO.RecycleOption.DeletePermanently)
Next
End Sub
''' <summary>
''' ファイルのコピー
''' </summary>
''' <param name="sourceFilePath">元ファイルパス</param>
''' <param name="targetFilePath">目標ファイルパス</param>
''' <remarks></remarks>
Public Shared Sub CopyFile(ByVal sourceFilePath As String, ByVal targetFilePath As String)
'\\コンピュータ名\共有名\(ディレクトリ名\)ファイル名
' 既に同名のファイルが存在していても上書きする場合
System.IO.File.Copy(sourceFilePath, targetFilePath, True)
End Sub
''' <summary>
''' フォルダ下のファイル全てコピーする
''' </summary>
''' <param name="sourceFolderPath"></param>
''' <param name="targetFolderPath"></param>
''' <remarks></remarks>
Public Shared Sub CopyAllFiles(ByVal sourceFolderPath As String, ByVal targetFolderPath As String)
My.Computer.FileSystem.CopyDirectory(sourceFolderPath, targetFolderPath, True)
End Sub
''' <summary>
''' ファイルの移動
''' </summary>
''' <param name="sourceFolderPath"></param>
''' <param name="targetFolderPath"></param>
''' <remarks></remarks>
Public Shared Sub MoveAllFiles(ByVal sourceFolderPath As String, ByVal targetFolderPath As String)
My.Computer.FileSystem.CopyDirectory(sourceFolderPath, targetFolderPath, True)
DeleteAllFillInDirectory(sourceFolderPath, "*.csv")
End Sub
''' <summary>
''' フォルダサイズの取得
''' </summary>
''' <param name="dirInfo"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetDirectorySize( _
ByVal dirInfo As DirectoryInfo) As Long
Dim size As Long = 0
'フォルダ内の全ファイルの合計サイズを計算する
Dim fi As FileInfo
For Each fi In dirInfo.GetFiles()
size += fi.Length
Next fi
'サブフォルダのサイズを合計していく
Dim di As DirectoryInfo
For Each di In dirInfo.GetDirectories()
size += GetDirectorySize(di)
Next di
'結果を返す
Return size
End Function
''' <summary>
''' フォルダ内、最新のファイル名を取得する
''' </summary>
''' <param name="targetFolderPath"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetLatestFileName(ByVal targetFolderPath As String)
Dim fso, fol, fc, f1, f2
fso = CreateObject("Scripting.FileSystemObject")
fol = fso.GetFolder(targetFolderPath)
fc = fol.Files
For Each f1 In fc
If f2 Is Nothing Then
f2 = fso.GetFile(f1)
End If
If f1.DateLastModified > f2.DateLastModified Then
f2 = fso.GetFile(f1)
End If
Next
Return f2.Name
End Function
''' <summary>
''' CSVファイルの先頭行を削除する
''' </summary>
''' <param name="filePath"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function DeleteCSVHeader(ByVal filePath As String) As Boolean
Try
'ファイルを読み込みで開く
Dim sr As New System.IO.StreamReader(filePath, System.Text.Encoding.GetEncoding("shift_jis"))
'一時ファイルを作成する
Dim tmpPath As String = System.IO.Path.GetTempFileName()
'一時ファイルを書き込みで開く
Dim sw As New System.IO.StreamWriter(tmpPath, False, System.Text.Encoding.GetEncoding("shift_jis"))
Dim isFirstLine As Boolean = True
'内容を一行ずつ読み込む
While sr.Peek() > -1
'一行読み込む
Dim line As String = sr.ReadLine()
'はじめの行であれば、飛ばす
If isFirstLine Then
isFirstLine = False
Continue While
End If
'一時ファイルに書き込む
sw.WriteLine(line)
End While
'閉じる
sr.Close()
sw.Close()
'一時ファイルと入れ替える
System.IO.File.Copy(tmpPath, filePath, True)
System.IO.File.Delete(tmpPath)
Return True
Catch ex As Exception
Return False
End Try
End Function
''' <summary>
''' ファイルとフォルダ操作権限有無の判断
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FileOrFolderIsReadOnly(ByVal path As String)
' ファイルやディレクトリの属性(群)を取得
Dim fas As System.IO.FileAttributes = System.IO.File.GetAttributes(path)
' 属性(群)の中に読み取り専用があるかどうかを確認(ビット演算)
Dim bReadOnly As Boolean = ((fas And System.IO.FileAttributes.ReadOnly) = System.IO.FileAttributes.ReadOnly)
Return bReadOnly
End Function
''' <summary>
''' ファイルがロック中かどうかの判断
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FileIsLocked(ByVal path As String)
Dim stream As FileStream = Nothing
Try
stream = New FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
stream.Close()
Catch ex As Exception
Return True
End Try
stream.Close()
Return False
End Function
''' <summary>
''' ファイル読み込み専用属性解除
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ReleaseReadAttr(ByVal path As String) As Boolean
Try
Dim fi As New System.IO.FileInfo(path)
'読み込み専用属性があるか調べる
If (fi.Attributes And System.IO.FileAttributes.ReadOnly) = System.IO.FileAttributes.ReadOnly Then
'読み取り専用属性を解除する
fi.IsReadOnly = False
End If
Return True
Catch ex As Exception
Return False
End Try
End Function
''' <summary>
''' ファイルのサイズを確認
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetFileSize(ByVal path As String)
Dim file As New System.IO.FileInfo(path)
Return file.Length
End Function
''' <summary>
''' ディレクトリアクセスチェック
''' </summary>
''' <param name="path"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function FolderAccessCheck(ByVal path As String) As Boolean
Try
'実行ユーザ名取得
Dim ident As System.Security.Principal.WindowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent()
Dim princ As New System.Security.Principal.WindowsPrincipal(ident)
'ファイルアクセス権所持ユーザと比較
Dim security As System.Security.AccessControl.DirectorySecurity = Directory.GetAccessControl(path)
For Each rule As System.Security.AccessControl.FileSystemAccessRule In security.GetAccessRules(True, True, GetType(System.Security.Principal.NTAccount))
If rule.IdentityReference.ToString = princ.Identity.Name Then
Return True
End If
Next
Return False
Catch ex As Exception
Return False
End Try
Return False
End Function
End Class