見出し画像

Python、「フォルダ、ファイル開かれたままだとエラー」試してみた。

import os
import datetime
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import re

# 変更済みのファイル名を記録するためのセット
renamed_files = set()

def is_folder_locked(folder_path):
    try:
        # フォルダを開こうとする
        with open(folder_path, 'r'):
            pass
        return False  # フォルダがロックされていない
    except IOError:
        return True  # フォルダがロックされている


def is_valid_folder_name(folder_name):
    # フォルダ名の正規表現パターン
    pattern = r'^ALL_\d{8}_コピー$'  # 8桁の数字(日付)にマッチ
    return re.match(pattern, folder_name) is not None

def rename_files(root_path):
    for file_name in os.listdir(root_path):
        file_path = os.path.join(root_path, file_name)
        if os.path.isfile(file_path):
            if file_name in renamed_files:
                print(f'フォルダとデータを閉じてください。{file_path} を再確認して下さい。')
                continue

            update_time = os.path.getmtime(file_path)
            update_time_str = datetime.datetime.fromtimestamp(update_time).strftime('%Y%m%d%H%M')
            # ファイル名の末尾に更新日時が含まれている場合は処理を中止する
            if file_name.endswith(f'_{update_time_str}{os.path.splitext(file_name)[1]}'):
                print(f'ファイル名の末尾に更新日時が含まれています。{file_path} をスキップします。')
                continue

            new_file_name = f'{os.path.splitext(file_name)[0]}_{update_time_str}{os.path.splitext(file_name)[1]}'
            new_file_path = os.path.join(os.path.dirname(file_path), new_file_name)
            if os.path.exists(new_file_path):
                print(f'エラー: {new_file_path} はすでに存在します。')
                continue

            os.rename(file_path, new_file_path)
            renamed_files.add(file_name)
            print(f'{file_path}{new_file_name} に変更しました')

def select_folder():
    root = tk.Tk()
    root.withdraw()  # メインウィンドウを非表示にする
    folder_path = filedialog.askdirectory(title='フォルダを選択してください')
    if folder_path:
        if is_folder_locked(folder_path):
            messagebox.showerror('エラー', 'フォルダ、ファイルが開かれているため処理を中止します。')
            return

        folder_name = os.path.basename(folder_path)
        if not is_valid_folder_name(folder_name):
            messagebox.showerror('エラー', 'フォルダ名が正しくありません。処理を中止します。')
            return

        rename_files(folder_path)
        if renamed_files:
            messagebox.showinfo('処理完了', 'ファイル名の変更が完了しました。')
        else:
            messagebox.showinfo('処理完了', '処理済みです。')
    else:
        messagebox.showinfo('キャンセル', '処理がキャンセルされました。')

if __name__ == "__main__":
    select_folder()



def is_folder_locked(folder_path):
    try:
        # フォルダを開こうとする
        with open(folder_path, 'r'):
            pass
        return False  # フォルダがロックされていない
    except IOError:
        return True  # フォルダがロックされている

この関数は、指定されたフォルダがロックされているかどうかを確認するために使用されます。with open(folder_path, 'r'):の部分でフォルダを開こうとし、IOErrorが発生した場合にフォルダがロックされていると判断します。


この記事が気に入ったらサポートをしてみませんか?