Namespace System
Namespace IO

/*
@brief  ファイルの情報取得,操作をするクラス
@date   2008/03/14
@author OverTaker
*/

Class FileInfo
	Inherits FileSystemInfo
Public
	/*
	@brief  コンストラクタ
	@param  ファイルパス
	*/
	Sub FileInfo(path As String)
		OriginalPath = path
		FullPath = Path.GetFullPath(path)
	End Sub

	'----------------------------------------------------------------
	' パブリック　プロパティ
	'----------------------------------------------------------------

	/*
	@brief  ひとつ上のフォルダを取得する
	@return フォルダを表すDirectoryInfo
	*/
	Function Directory() As DirectoryInfo
		Return New DirectoryInfo(Path.GetDirectoryName(FullPath))
	End Function

	/*
	@brief  ひとつ上のフォルダ名を取得する
	@return フォルダを表すファイルパス
	*/
	Function DirectoryName() As String
		Return Path.GetDirectoryName(FullPath)
	End Function

	/*
	@brief  ファイルが読み取り専用かどうかを取得する
	@retval True  読み取り専用ファイル
	@retval False 読み取り専用ファイルではない
	*/
	Function IsReadOnly() As Boolean
		If (Attributes and FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
			Return True
		Else
			Return False
		End If
	End Function

	/*
	@brief  ファイルサイズを取得する
	@return ファイルサイズ
	*/
	Function Length() As QWord
		Dim hFile = CreateFile(ToTCStr(FullPath), GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
		If hFile = INVALID_HANDLE_VALUE Then
			Throw New IOException("FileInfo.Length: Failed to CreateFile.")
			Exit Function
		End If

		Dim pLength = VarPtr(Length) As *ULARGE_INTEGER
		pLength->LowPart = GetFileSize(hFile, VarPtr(pLength->HighPart))
		CloseHandle(hFile)

		Dim error = GetLastError()
		If pLength->LowPart = INVALID_FILE_SIZE And error <> NO_ERROR Then
			Throw New IOException("FileInfo.Length: Failed to GetFileSize", HRESULT_FROM_WIN32(error))
		End If
	End Function

	'----------------------------------------------------------------
	' パブリック　メソッド
	'----------------------------------------------------------------

	/*
	@brief  ファイルにテキストを追加するストリームライターを作成する
	@return ストリームライター
	*/
	Function AppendText() As StreamWriter
		Return File.AppendText(FullPath)
	End Function

	/*
	@brief  ファイルをコピーする(上書きしない)
	@param  コピー先のファイルパス
	@return コピー先のファイルを表すFileInfo
	*/
	Function CopyTo(destFileName As String) As FileInfo
		Return CopyTo(destFileName, False)
	End Function

	/*
	@brief  ファイルをコピーする
	@param  コピー先のファイルパス
	@param  ファイルを上書きするかどうか
	@return コピー先のファイルを表すFileInfo
	*/
	Function CopyTo(destFileName As String, overwrite As Boolean) As FileInfo
		File.Copy(FullPath, destFileName, overwrite)
		Return New FileInfo(destFileName)
	End Function

	/*
	@brief  ファイルを作成する
	@return ファイルストリーム
	*/
	Function Create() As FileStream
		Return File.Create(FullPath)
	End Function

	/*
	@brief  ファイルを作成し、そのストリームライターを取得する
	@return ストリームライター
	*/
	Function CreateText() As StreamWriter
		Return New StreamWriter(Create())
	End Function

/*	Sub Decrypt()
	End Sub*/

	/*
	@brief  ファイルを削除する
	*/
	Override Sub Delete()
		File.Delete(FullPath)
	End Sub

/*	Sub Encrypt()
	End Sub*/

/*	Function GetAccessControl() As FileSecurity
	End Function*/

/*	Function GetAccessControl(includeSections As AccessControlSections) As FileScurity
	End Function*/

	/*
	@brief  ファイルを移動する
	@param  移動先のファイルパス
	*/
	Sub MoveTo(destFileName As String)
		File.Move(FullPath, destFileName)
	End Sub

	/*
	@brief  ファイルストリームを作成する
	@param  ファイルモード
	@return ファイルストリーム
	*/
	Function Open(mode As FileMode) As FileStream
		Return New FileStream(FullPath, mode)
	End Function

	/*
	@brief  ファイルストリームを作成する
	@param  ファイルモード
	@param  ファイルアクセス
	@return ファイルストリーム
	*/
	Function Open(mode As FileMode, access As FileAccess) As FileStream
		Return New FileStream(FullPath, mode, access)
	End Function

	/*
	@brief  ファイルストリームを作成する
	@param  ファイルモード
	@param  ファイルアクセス
	@param  ファイル共有
	@return ファイルストリーム
	*/
	Function Open(mode As FileMode, access As FileAccess, share As FileShare ) As FileStream
		Return New FileStream(FullPath, mode, access, share)
	End Function

	/*
	@brief  読み取り専用のファイルストリームを作成する
	@return ファイルストリーム
	*/
	Function OpenRead() As FileStream
		Return Open(FileMode.Open, FileAccess.Read, FileShare.Read)
	End Function

	/*
	@brief  読み取り専用のストリームを作成する
	@param  ファイルパス
	@return ストリームリーダー
	*/
	Function OpenText() As StreamReader
		Return New StreamReader(FullPath)
	End Function

	/*
	@brief  書き込み専用のファイルストリームを作成する
	@return ファイルストリーム
	*/
	Function OpenWrite() As FileStream
		Return Open(FileMode.Open, FileAccess.Write)
	End Function

	/*
	@brief  ファイルを置き換える
	@param  置き換え先のファイルパス
	@param  置き換えられるファイルのバックアップを作成するファイルパス
	*/
	Function Replace(destinationFileName As String, destinationBackupFileName As String) As FileInfo
		File.Replace(FullPath, destinationFileName, destinationBackupFileName)
	End Function

/*	Function Replace(destinationFileName As String, destinationBackupFileName As String, ignoreMetadataErrors As Boolean) As FileInfo
	End Function*/

/*	Sub SetAccessControl(fileSecurity As FileSecurity)
	End Sub*/

	/*
	@brief  インスタンスを文字列で表す
	@return ファイルパス
	*/
	Override Function ToString() As String
		Return FullPath
	End Function

End Class


End Namespace
End Namespace
