[PowerShell]ファイルのロック状態を確認するFunction

2024/06/18に公開

概要

ファイルが開かれているか検証できるFunctionを自作。

この記事のターゲット

  • PowerShellユーザーの方
  • ファイルパスを指定しFunctionを実行すると下記の結果が返るFunctionを知りたい方
    ファイルが開かれロック状態の場合「$True」を返す。
    ファイルを開いておらずロック状態ではない状態の場合「$False」を返す。

対応方法

ファイルのロック状態を確認するFunction

ファイルのロック状態を確認するFunction
function Test-FileLocked {
    param (
        [Parameter(Mandatory=$true)][System.String]$Path
    )

    if (-Not(Test-Path $Path)) {
        Write-Error '対象ファイルが存在しません。' -ErrorAction Stop
    }

    # 相対パスだとOpenメソッドが正常動作しない為、絶対パスに変換
    $fullPath = (Resolve-Path -Path $Path).Path

    $fileLocked = $false
    try {
        # 読み取り専用でファイルを開く処理を実行
        $fileStream = [System.IO.File]::Open($fullPath, 'Open', 'ReadWrite', 'None')
    }
    catch {
        # ファイルが開けない場合、ロック状態と判断
        $fileLocked = $true
    }
    finally {
        if ($null -ne $fileStream) {
            $fileStream.Close()
        }
    }

    return $fileLocked
}

Openメソッドの2通りの指定方法

前述した簡易な指定方法の方が見やすいですが、Namespaceを指定する方法でも動作します。

Openメソッドの2通りの指定方法
# 簡易な指定方法
[System.IO.File]::Open($Path, 'Open', 'Read', 'None')

# Namespaceをしっかりと指定する場合
[System.IO.File]::Open($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::None)
補足情報:Openメソッドの引数について

今回のコードで実行しているOpenメソッドの引数について

  • 引数1: $fullPath = 対象のファイルの絶対パスを指定
    ※ 相対パスだとカレントディレクトリの位置が“C:\Users\ユーザー名”はじまりとなっている。
  • 引数2: 'Open' = 既存のファイルを開く
    FileMode 列挙型
  • 引数3: 'Read' = 読み取り専用でファイルにアクセス
    FileAccess 列挙型
  • 引数4: 'None' = 後続のオープン要求を拒否
    FileShare 列挙型

複数の指定方法がある引数「FileMode / FileAccess / FileShare」を紹介。

  • 引数2: FileMode 列挙型
    • CreateNew: 新しいファイルを作成。ファイルが存在する場合は、IOException例外がスローされる。
    • Create: 新しいファイルを作成。ファイルが存在する場合は上書き。
    • Open: 既存のファイルを開く。
    • OpenOrCreate: ファイルが存在する場合はファイルを開く。ファイルが存在しない場合は新しいファイルを作成。
    • Truncate: 既存のファイルを開く。ファイルが存在する場合はファイルを開く。ファイルが存在しない場合は何もしない。
    • Append: ファイルが存在する場合は、そのファイルを開きファイルの末尾に追加する。ファイルが存在しない場合は新しいファイルを作成。
  • 引数3: FileAccess 列挙型
    • CreateNew: 新しいファイルを作成。ファイルが存在する場合は、IOException例外がスローされる。
    • Create: 新しいファイルを作成。ファイルが存在する場合は上書き。
    • Open: 既存のファイルを開く。
    • OpenOrCreate: ファイルが存在する場合はファイルを開く。ファイルが存在しない場合は新しいファイルを作成。
    • Truncate: 既存のファイルを開く。ファイルが存在する場合はファイルを開く。ファイルが存在しない場合は何もしない。
    • Append: ファイルが存在する場合は、そのファイルを開きファイルの末尾に追加する。ファイルが存在しない場合は新しいファイルを作成。
  • 引数3: FileShare 列挙型
    • None: 後続のオープン要求を拒否する。
    • Read: 後続の読み取り専用でのオープン要求のみ許可。
    • Write: 後続の書き込みのオープン要求を許可。
    • Delete: 後続のファイルの削除要求を許可。
    • Inheritable: 親プロセスでFileShare.Inheritableを指定してファイルを開き、子プロセスが生成された後、親プロセスがそのファイルを閉じると子プロセスに権限が継承される。

参考情報

https://learn.microsoft.com/ja-jp/dotnet/api/system.io.file.open

まとめ

  • ファイルのロック状態を確認できるFunctionを自作できた
  • 使用用途によりOpenメソッドの引数を変更するとオーダーメイドのFunctionが作成可能

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960
https://zenn.dev/haretokidoki/articles/fb6830f9155de5

GitHubで編集を提案

Discussion