Spaces:
Running
Running
File size: 2,587 Bytes
227e75d 5a2169d 227e75d 5a2169d 227e75d 20c757d 227e75d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
from pathlib import Path
from typing import List, Dict, Optional
from dataclasses import dataclass
@dataclass
class FileInfo:
path: Path
size: int
extension: str
content: Optional[str] = None
encoding: Optional[str] = None
@property
def formatted_size(self) -> str:
if self.size < 1024:
return f"{self.size} B"
elif self.size < 1024 * 1024:
return f"{self.size/1024:.1f} KB"
else:
return f"{self.size/(1024*1024):.1f} MB"
class FileScanner:
# スキャン対象の拡張子
TARGET_EXTENSIONS = {
'.py', '.js', '.java', '.cpp', '.hpp', '.c', '.h',
'.go', '.rs', '.php', '.rb', '.ts', '.scala', '.kt',
'.cs', '.swift', '.m', '.sh', '.pl', '.r'
}
# スキャン対象から除外するディレクトリ
EXCLUDED_DIRS = {
'.git', '__pycache__', 'node_modules', 'venv', '.env',
'build', 'dist', 'target', 'bin', 'obj'
}
def __init__(self, base_dir: Path):
self.base_dir = base_dir
def _should_scan_file(self, path: Path) -> bool:
if any(excluded in path.parts for excluded in self.EXCLUDED_DIRS):
return False
return path.suffix.lower() in self.TARGET_EXTENSIONS
def _read_file_content(self, file_path: Path) -> Optional[str]:
try:
# まずUTF-8で試す
try:
with file_path.open('r', encoding='utf-8') as f:
return f.read()
except UnicodeDecodeError:
# UTF-8で失敗したらcp932を試す
with file_path.open('r', encoding='cp932') as f:
return f.read()
except (OSError, UnicodeDecodeError):
return None
def scan_files(self) -> List[FileInfo]:
if not self.base_dir.exists():
raise FileNotFoundError(f"Directory not found: {self.base_dir}")
files = []
for entry in self.base_dir.rglob('*'):
if entry.is_file() and self._should_scan_file(entry):
content = self._read_file_content(entry)
if content is not None:
files.append(FileInfo(
path=entry.relative_to(self.base_dir),
size=entry.stat().st_size, # ファイルサイズを追加
extension=entry.suffix, # 拡張子を追加
content=content
))
return sorted(files, key=lambda x: str(x.path))
|