<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>フォルダ一覧 - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E4%B8%80%E8%A6%A7/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Mon, 09 Feb 2026 01:55:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://caymezon.com/wp-content/uploads/2026/01/cropped-CayTechLab-32x32.jpg</url>
	<title>フォルダ一覧 - CayTech Lab</title>
	<link>https://caymezon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://caymezon.com/?pushpress=hub'/>
	<item>
		<title>VSCodeで「フォルダ一覧取得」を実現するTypeScriptマクロ【ファイル管理が10倍速くなる】</title>
		<link>https://caymezon.com/vscode-folder-list-macro/</link>
					<comments>https://caymezon.com/vscode-folder-list-macro/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 09 Feb 2026 01:55:10 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[ファイル管理]]></category>
		<category><![CDATA[フォルダ一覧]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[生産性向上]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20111</guid>

					<description><![CDATA[<p>目次 はじめになぜこのツールが必要なのか？Windowsの標準機能では実現困難このマクロで実現できること実装した機能主な機能出力例実務での活用例例1：プロジェクトのファイル構成をドキュメント化例2：共有フォルダの棚卸し例 [&#8230;]</p>
<p>The post <a href="https://caymezon.com/vscode-folder-list-macro/">VSCodeで「フォルダ一覧取得」を実現するTypeScriptマクロ【ファイル管理が10倍速くなる】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">なぜこのツールが必要なのか？</a><ol><li><a href="#toc3" tabindex="0">Windowsの標準機能では実現困難</a></li><li><a href="#toc4" tabindex="0">このマクロで実現できること</a></li></ol></li><li><a href="#toc5" tabindex="0">実装した機能</a><ol><li><a href="#toc6" tabindex="0">主な機能</a></li><li><a href="#toc7" tabindex="0">出力例</a></li></ol></li><li><a href="#toc8" tabindex="0">実務での活用例</a><ol><li><a href="#toc9" tabindex="0">例1：プロジェクトのファイル構成をドキュメント化</a></li><li><a href="#toc10" tabindex="0">例2：共有フォルダの棚卸し</a></li><li><a href="#toc11" tabindex="0">例3：納品物のファイルリスト作成</a></li><li><a href="#toc12" tabindex="0">例4：バックアップ前の記録</a></li><li><a href="#toc13" tabindex="0">例5：プロジェクトの進捗報告</a></li></ol></li><li><a href="#toc14" tabindex="0">TypeScriptコード解説</a><ol><li><a href="#toc15" tabindex="0">メイン処理（listFolderContents.ts）</a></li><li><a href="#toc16" tabindex="0">オプション選択ダイアログ</a></li><li><a href="#toc17" tabindex="0">警告ダイアログ（再帰検索時）</a></li><li><a href="#toc18" tabindex="0">プログレス表示とタイムアウト</a></li><li><a href="#toc19" tabindex="0">再帰的ファイル取得</a></li><li><a href="#toc20" tabindex="0">出力フォーマット生成</a></li></ol></li><li><a href="#toc21" tabindex="0">使い方</a><ol><li><a href="#toc22" tabindex="0">1. 拡張機能のインストール</a></li><li><a href="#toc23" tabindex="0">2. 基本的な使い方</a></li><li><a href="#toc24" tabindex="0">3. 実践例</a></li></ol></li><li><a href="#toc25" tabindex="0">package.jsonの設定</a></li><li><a href="#toc26" tabindex="0">メリット・デメリット</a><ol><li><a href="#toc27" tabindex="0">メリット</a></li><li><a href="#toc28" tabindex="0">デメリット</a></li></ol></li><li><a href="#toc29" tabindex="0">トラブルシューティング</a><ol><li><a href="#toc30" tabindex="0">Q: パスが見つからない</a></li><li><a href="#toc31" tabindex="0">Q: 処理が途中で止まる</a></li><li><a href="#toc32" tabindex="0">Q: ネットワークドライブが遅い</a></li><li><a href="#toc33" tabindex="0">Q: node_modulesが除外される</a></li><li><a href="#toc34" tabindex="0">Q: ファイルが保存できない</a></li></ol></li><li><a href="#toc35" tabindex="0">まとめ</a></li><li><a href="#toc36" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>プロジェクト管理や作業記録で、こんな悩みありませんか？</p>
<pre><code class="language-plaintext">作業メモ.txt
---
■ タスク
プロジェクトフォルダのファイル構成をドキュメント化
→ C:\work\my-project のファイル一覧を取得したい

■ 課題
共有フォルダの棚卸し
→ \\server\share\old-projects のファイル数とサイズを確認したい</code></pre>
<p><strong>「フォルダ配下のファイル一覧が欲しい」</strong><br /><strong>「サイズや更新日時も記録したい」</strong><br /><strong>「再帰的に全サブフォルダも取得したい」</strong></p>
<p>Windowsのエクスプローラーでは、ファイル一覧をテキストでコピーできません。コマンドプロンプトで<code>dir</code>コマンド…も面倒。</p>
<p>今回、<strong>カーソル行のフォルダパスから一覧を取得し、別ファイルに出力する</strong>TypeScriptマクロを実装しました。</p>
<p>シンプル版と詳細版の2モードで、実務でのファイル管理が劇的に効率化します。</p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで (Software Design plus)","b":"技術評論社","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/510GhCOD1FL._SL500_.jpg","\/41og2y1EEHL._SL500_.jpg","\/51XHb97PpFL._SL500_.jpg","\/51uDIY22bQL._SL500_.jpg","\/51PaoVK3MWL._SL500_.jpg","\/51eG7JBoavL._SL500_.jpg","\/51CDCo8FmJL._SL500_.jpg","\/41JLTXb+tsL._SL500_.jpg","\/51Hsv39e7IL._SL500_.jpg","\/41PTe+TqLEL._SL500_.jpg","\/51TUxdoXjrL._SL500_.jpg","\/51AkZEJWGhL._SL500_.jpg","\/51paP7D5R5L._SL500_.jpg","\/41lJtbpaQvL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4297127474","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4297127474","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AETypeScript%E5%85%A5%E9%96%80%20%E5%AE%89%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8B%E3%82%89%E9%AB%98%E5%BA%A6%E3%81%AA%E5%9E%8B%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A7%20(Software%20Design%20plus)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AETypeScript%E5%85%A5%E9%96%80%20%E5%AE%89%E5%85%A8%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%8B%E3%82%89%E9%AB%98%E5%BA%A6%E3%81%AA%E5%9E%8B%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A7%20(Software%20Design%20plus)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"OaDLa","s":"s"});</script></p>
<div id="msmaflink-OaDLa">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">なぜこのツールが必要なのか？</span></h2>
<h3><span id="toc3">Windowsの標準機能では実現困難</span></h3>
<p><strong>エクスプローラーの限界：</strong></p>
<ul>
<li>ファイル一覧をテキストでコピーできない</li>
<li>ドラッグ＆ドロップは画像のみ</li>
<li>パスのリストは手動でコピペが必要</li>
</ul>
<p><strong>コマンドプロンプトの課題：</strong></p>
<pre><code class="language-cmd">dir /s /b C:\work\my-project &gt; list.txt</code></pre>
<ul>
<li>パス指定が面倒</li>
<li>オプションを毎回調べる必要</li>
<li>出力フォーマットの調整が困難</li>
</ul>
<p><strong>PowerShellでも：</strong></p>
<pre><code class="language-powershell">Get-ChildItem -Recurse | Out-File list.txt</code></pre>
<ul>
<li>コマンドが長い</li>
<li>カスタマイズが複雑</li>
<li>毎回コマンドを打つのが手間</li>
</ul>
<h3><span id="toc4">このマクロで実現できること</span></h3>
<table>
<thead>
<tr>
<th>項目</th>
<th>エクスプローラー</th>
<th>コマンドライン</th>
<th>このマクロ</th>
</tr>
</thead>
<tbody>
<tr>
<td>ファイル一覧</td>
<td>❌ コピー不可</td>
<td>⚠️ コマンド必要</td>
<td>✅ 1キー</td>
</tr>
<tr>
<td>サイズ・日時</td>
<td>❌ 手動</td>
<td>⚠️ フォーマット調整</td>
<td>✅ 自動</td>
</tr>
<tr>
<td>再帰検索</td>
<td>❌ 不可</td>
<td>✅ 可能</td>
<td>✅ モード選択</td>
</tr>
<tr>
<td>安全装置</td>
<td>-</td>
<td>❌ なし</td>
<td>✅ タイムアウト等</td>
</tr>
<tr>
<td>操作数</td>
<td>手動コピペ</td>
<td>コマンド入力</td>
<td>1キー操作</td>
</tr>
</tbody>
</table>
<h2><span id="toc5">実装した機能</span></h2>
<h3><span id="toc6">主な機能</span></h3>
<p><strong>ショートカット:</strong></p>
<ul>
<li><code>Ctrl+F11</code>: シンプル版（パスのみ）</li>
<li><code>Ctrl+Shift+F11</code>: 詳細版（サイズ・日時付き）</li>
</ul>
<p>✅ <strong>2つの出力モード</strong></p>
<ul>
<li>シンプル版：パスのみをリスト化</li>
<li>詳細版：ファイルサイズ＋更新日時付き</li>
</ul>
<p>✅ <strong>4つの取得モード</strong>（ダイアログで選択）</p>
<ol>
<li>直下のみ（フォルダ + ファイル）← 最も安全</li>
<li>直下のみ（ファイルのみ）</li>
<li>再帰的（フォルダ + ファイル）← 警告付き</li>
<li>再帰的（ファイルのみ）← 警告付き</li>
</ol>
<p>✅ <strong>充実の安全装置</strong></p>
<ul>
<li>再帰検索時の確認ダイアログ</li>
<li>ネットワークドライブ検出＆警告</li>
<li>タイムアウト：60秒</li>
<li>最大件数：50,000件（超過時は切り詰め）</li>
<li>プログレス表示＋キャンセル可能</li>
<li><code>node_modules</code>, <code>.git</code>, <code>dist</code>等を自動除外</li>
</ul>
<p>✅ <strong>柔軟なパス指定</strong></p>
<ul>
<li>ファイルパス → 親フォルダを対象</li>
<li>フォルダパス → そのフォルダを対象</li>
<li>絶対パス、相対パス、ネットワークパス対応</li>
</ul>
<h3><span id="toc7">出力例</span></h3>
<p><strong>シンプル版（Ctrl+F11）</strong></p>
<pre><code class="language-plaintext">============================================================
フォルダ一覧取得結果
============================================================
実行日時: 2024-02-08 15:30:45
対象フォルダ: C:\work\my-project
モード: 直下のみ（フォルダ + ファイル）
取得件数: 25 件
============================================================

C:\work\my-project\src
C:\work\my-project\test
C:\work\my-project\package.json
C:\work\my-project\README.md
C:\work\my-project\tsconfig.json
...</code></pre>
<p><strong>詳細版（Ctrl+Shift+F11）</strong></p>
<pre><code class="language-plaintext">============================================================
フォルダ一覧取得結果
============================================================
実行日時: 2024-02-08 15:30:45
対象フォルダ: C:\work\my-project
モード: 再帰的（ファイルのみ）
取得件数: 234 件
============================================================

[DIR ] C:\work\my-project\src
[FILE] C:\work\my-project\src\main.ts          (12.5 KB) 2024-02-01
[FILE] C:\work\my-project\src\util.ts          (8.2 KB)  2024-02-05
[DIR ] C:\work\my-project\test
[FILE] C:\work\my-project\test\test.ts         (4.1 KB)  2024-02-03
[FILE] C:\work\my-project\package.json         (1.2 KB)  2024-01-30
...</code></pre>
<h2><span id="toc8">実務での活用例</span></h2>
<h3><span id="toc9">例1：プロジェクトのファイル構成をドキュメント化</span></h3>
<p><strong>シーン：READMEにファイル構成を記載</strong></p>
<pre><code class="language-plaintext">README.md作成タスク
---
プロジェクト: C:\work\api-server</code></pre>
<p><strong>手順：</strong></p>
<ol>
<li>カーソルをパスの行に置く</li>
<li><code>Ctrl+F11</code> → 直下のみ（全て）</li>
<li>結果をREADMEにコピペ</li>
</ol>
<p><strong>成果：</strong></p>
<pre><code class="language-markdown">## ファイル構成
src/
  main.ts       - エントリーポイント
  routes/       - APIルート定義
  models/       - データモデル
test/           - テストコード
package.json    - 依存関係</code></pre>
<h3><span id="toc10">例2：共有フォルダの棚卸し</span></h3>
<p><strong>シーン：不要ファイルの洗い出し</strong></p>
<pre><code class="language-plaintext">棚卸しタスク
---
対象: \\server\share\old-projects</code></pre>
<p><strong>手順：</strong></p>
<ol>
<li><code>Ctrl+Shift+F11</code> → 再帰的（ファイルのみ）</li>
<li>警告確認 → 続行</li>
<li>サイズと日時で古いファイルを特定</li>
</ol>
<p><strong>成果：</strong></p>
<pre><code class="language-plaintext">[FILE] \\server\share\old-projects\backup_2020.zip  (500 MB) 2020-01-15
[FILE] \\server\share\old-projects\temp.dat         (1.2 GB) 2019-08-22
→ 不要ファイルを削除して1.7GB削減</code></pre>
<h3><span id="toc11">例3：納品物のファイルリスト作成</span></h3>
<p><strong>シーン：納品前のファイルリスト作成</strong></p>
<pre><code class="language-plaintext">納品準備
---
成果物フォルダ: C:\delivery\client-system-v1.0</code></pre>
<p><strong>手順：</strong></p>
<ol>
<li><code>Ctrl+F11</code> → 再帰的（全て）</li>
<li>ファイルリストを納品書に添付</li>
</ol>
<p><strong>成果：</strong></p>
<pre><code class="language-plaintext">【納品物一覧】
src/           - ソースコード（50ファイル）
docs/          - 設計書・マニュアル（12ファイル）
installer/     - インストーラー（3ファイル）
合計：65ファイル</code></pre>
<h3><span id="toc12">例4：バックアップ前の記録</span></h3>
<p><strong>シーン：バックアップ前のスナップショット</strong></p>
<pre><code class="language-plaintext">バックアップ計画
---
対象: C:\important-data</code></pre>
<p><strong>手順：</strong></p>
<ol>
<li><code>Ctrl+Shift+F11</code> → 再帰的（詳細版）</li>
<li>ファイル一覧をバックアップと一緒に保存</li>
</ol>
<p><strong>成果：</strong></p>
<ul>
<li>バックアップ時のファイル構成を記録</li>
<li>復旧時に何があったか確認可能</li>
<li>サイズと日時で変更箇所を追跡</li>
</ul>
<h3><span id="toc13">例5：プロジェクトの進捗報告</span></h3>
<p><strong>シーン：週次報告でのファイル数増加報告</strong></p>
<pre><code class="language-plaintext">先週: 150ファイル
今週: 234ファイル
→ 84ファイル増加（機能追加により）</code></pre>
<p><strong>手順：</strong></p>
<ol>
<li>毎週同じフォルダで<code>Ctrl+F11</code>実行</li>
<li>ファイル数の推移を記録</li>
<li>報告書に添付</li>
</ol>
<h2><span id="toc14">TypeScriptコード解説</span></h2>
<h3><span id="toc15">メイン処理（listFolderContents.ts）</span></h3>
<pre><code class="language-typescript">import * as vscode from 'vscode';
import * as path from 'path';
import * as fs from 'fs';

/**
 * 出力モード
 */
enum OutputMode {
    Simple,   // シンプル（パスのみ）
    Detailed  // 詳細（サイズ・日時付き）
}

/**
 * 一覧取得オプション
 */
interface ListOptions {
    recursive: boolean;    // 再帰的に取得するか
    filesOnly: boolean;    // ファイルのみか
}

/**
 * フォルダ一覧取得（シンプル版）
 */
export async function listFolderContentsSimple() {
    await listFolderContents(OutputMode.Simple);
}

/**
 * フォルダ一覧取得（詳細版）
 */
export async function listFolderContentsDetailed() {
    await listFolderContents(OutputMode.Detailed);
}

/**
 * メイン処理
 */
async function listFolderContents(mode: OutputMode) {
    const editor = vscode.window.activeTextEditor;
    if (!editor) {
        vscode.window.showWarningMessage('アクティブなエディタがありません');
        return;
    }

    // カーソル行からパスを取得
    const line = editor.document.lineAt(editor.selection.active.line);
    let targetPath = line.text.trim();

    // パス前処理
    targetPath = preprocessPath(targetPath);
    targetPath = resolveAbsolutePath(targetPath, editor.document.uri.fsPath);

    // 存在チェック
    if (!fs.existsSync(targetPath)) {
        vscode.window.showErrorMessage(`パスが見つかりません: ${targetPath}`);
        return;
    }

    // フォルダパスに変換（ファイルの場合は親フォルダ）
    const folderPath = getFolderPath(targetPath);

    // オプション選択
    const options = await showOptionsDialog();
    if (!options) return;

    // 再帰的検索の場合は警告
    if (options.recursive) {
        const confirmed = await showWarningDialog(folderPath);
        if (!confirmed) return;
    }

    // 実行
    await executeWithProgress(folderPath, options, mode);
}</code></pre>
<h3><span id="toc16">オプション選択ダイアログ</span></h3>
<pre><code class="language-typescript">/**
 * オプション選択ダイアログ
 */
async function showOptionsDialog(): Promise&lt;ListOptions | null&gt; {
    const items = [
        {
            label: '$(file-directory) 直下のみ（フォルダ + ファイル）',
            description: '最も安全。1階層のみ取得',
            recursive: false,
            filesOnly: false
        },
        {
            label: '$(file) 直下のみ（ファイルのみ）',
            description: '最も安全。1階層のファイルのみ',
            recursive: false,
            filesOnly: true
        },
        {
            label: '$(repo) 再帰的（フォルダ + ファイル）',
            description: '⚠️ 時間がかかる可能性あり',
            recursive: true,
            filesOnly: false
        },
        {
            label: '$(files) 再帰的（ファイルのみ）',
            description: '⚠️ 時間がかかる可能性あり',
            recursive: true,
            filesOnly: true
        }
    ];

    const selected = await vscode.window.showQuickPick(items, {
        placeHolder: '一覧取得のモードを選択してください',
        ignoreFocusOut: true
    });

    if (!selected) return null;

    return {
        recursive: selected.recursive,
        filesOnly: selected.filesOnly
    };
}</code></pre>
<h3><span id="toc17">警告ダイアログ（再帰検索時）</span></h3>
<pre><code class="language-typescript">/**
 * 警告ダイアログ
 */
async function showWarningDialog(folderPath: string): Promise&lt;boolean&gt; {
    let warningMessage = '⚠️ 再帰的検索を実行します。\n';

    // ネットワークドライブ警告
    if (isNetworkPath(folderPath)) {
        warningMessage += '\n⚠️ ネットワークドライブが検出されました。\n' +
                         '処理に非常に時間がかかる可能性があります。\n';
    }

    warningMessage += '\n続行しますか？';

    const answer = await vscode.window.showWarningMessage(
        warningMessage,
        { modal: true },
        '続行', 'キャンセル'
    );

    return answer === '続行';
}

/**
 * ネットワークパスかどうか判定
 */
function isNetworkPath(p: string): boolean {
    return p.startsWith('\\\\') || p.startsWith('//');
}</code></pre>
<h3><span id="toc18">プログレス表示とタイムアウト</span></h3>
<pre><code class="language-typescript">/**
 * プログレス表示付きで実行
 */
async function executeWithProgress(
    folderPath: string,
    options: ListOptions,
    mode: OutputMode
) {
    await vscode.window.withProgress({
        location: vscode.ProgressLocation.Notification,
        title: "フォルダ一覧を取得中...",
        cancellable: true
    }, async (progress, token) => {
        try {
            let isCancelled = false;

            // キャンセルトークン
            token.onCancellationRequested(() => {
                isCancelled = true;
            });

            // タイムアウトPromise（60秒）
            const timeoutPromise = new Promise&lt;never&gt;((_, reject) =&gt; {
                setTimeout(() =&gt; reject(new Error('タイムアウト（60秒）')), 60000);
            });

            // ファイル一覧取得Promise
            const listPromise = listFiles(folderPath, options, mode, (count) =&gt; {
                progress.report({
                    message: `${count}件取得済み...`,
                    increment: 1
                });
                return isCancelled;
            });

            // タイムアウトとレース
            const result = await Promise.race([listPromise, timeoutPromise]);

            if (isCancelled) {
                vscode.window.showInformationMessage('処理をキャンセルしました');
                return;
            }

            // 結果を出力
            await createResultFile(folderPath, options, result.files, result.truncated, mode);

            let message = `取得完了: ${result.files.length}件`;
            if (result.truncated) {
                message += '（上限50,000件に達したため切り詰め）';
            }
            vscode.window.showInformationMessage(message);

        } catch (error: any) {
            if (error.message.includes('タイムアウト')) {
                vscode.window.showErrorMessage('処理がタイムアウトしました（60秒）');
            } else {
                vscode.window.showErrorMessage(`エラー: ${error.message}`);
            }
        }
    });
}</code></pre>
<h3><span id="toc19">再帰的ファイル取得</span></h3>
<pre><code class="language-typescript">/**
 * 除外するフォルダ名
 */
const EXCLUDE_PATTERNS = [
    'node_modules',
    '.git',
    '.vscode',
    'target',
    'dist',
    'build',
    'out',
    'bin',
    '.idea'
];

/**
 * 最大件数
 */
const MAX_FILES = 50000;

/**
 * 再帰的にファイル一覧を取得
 */
async function listFilesRecursive(
    folderPath: string,
    files: FileInfo[],
    options: ListOptions,
    mode: OutputMode,
    onProgress: (count: number) =&gt; boolean
) {
    // キャンセルチェック
    if (onProgress(files.length)) return;

    // 最大件数チェック
    if (files.length &gt;= MAX_FILES) return;

    try {
        const entries = fs.readdirSync(folderPath, { withFileTypes: true });

        for (const entry of entries) {
            const fullPath = path.join(folderPath, entry.name);

            if (entry.isDirectory()) {
                // 除外パターンチェック
                if (EXCLUDE_PATTERNS.includes(entry.name)) {
                    continue;
                }

                if (!options.filesOnly) {
                    files.push(createFileInfo(fullPath, true, mode));
                }

                // 再帰
                await listFilesRecursive(fullPath, files, options, mode, onProgress);
            } else {
                files.push(createFileInfo(fullPath, false, mode));
            }

            // 最大件数チェック
            if (files.length &gt;= MAX_FILES) return;
        }
    } catch (error: any) {
        // アクセス権限エラーなどは無視
        console.error(`Error accessing ${folderPath}:`, error.message);
    }
}</code></pre>
<h3><span id="toc20">出力フォーマット生成</span></h3>
<pre><code class="language-typescript">/**
 * 出力内容を生成
 */
function generateOutput(
    folderPath: string,
    options: ListOptions,
    files: FileInfo[],
    truncated: boolean,
    mode: OutputMode
): string {
    const lines: string[] = [];

    // ヘッダー
    lines.push('='.repeat(60));
    lines.push('フォルダ一覧取得結果');
    lines.push('='.repeat(60));
    lines.push(`実行日時: ${formatDateTime(new Date())}`);
    lines.push(`対象フォルダ: ${folderPath}`);
    lines.push(`モード: ${getModeText(options)}`);
    lines.push(`取得件数: ${files.length.toLocaleString()} 件`);

    if (truncated) {
        lines.push('⚠️ 上限50,000件に達したため切り詰めました');
    }

    lines.push('='.repeat(60));
    lines.push('');

    // ファイル一覧
    if (mode === OutputMode.Simple) {
        // シンプル版：パスのみ
        files.forEach(file =&gt; {
            lines.push(file.path);
        });
    } else {
        // 詳細版：サイズ・日時付き
        files.forEach(file =&gt; {
            const type = file.isDirectory ? '[DIR ]' : '[FILE]';
            const sizeStr = file.size !== undefined ? formatSize(file.size) : '';
            const dateStr = file.modifiedDate ? formatDate(file.modifiedDate) : '';

            let line = `${type} ${file.path}`;
            if (sizeStr) line += `  (${sizeStr})`;
            if (dateStr) line += ` ${dateStr}`;

            lines.push(line);
        });
    }

    return lines.join('\n');
}

/**
 * ファイルサイズをフォーマット
 */
function formatSize(bytes: number): string {
    if (bytes &lt; 1024) return `${bytes} B`;
    if (bytes &lt; 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
    if (bytes &lt; 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
    return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
}</code></pre>
<h2><span id="toc21">使い方</span></h2>
<h3><span id="toc22">1. 拡張機能のインストール</span></h3>
<pre><code class="language-bash"># GitHubからクローン
git clone https://github.com/xxxxx-sys/my-macros.git
cd my-macros

# 依存関係インストール
npm install --legacy-peer-deps

# パッケージ化
npm run compile
npx vsce package

# インストール
code --install-extension my-macros-0.0.6.vsix</code></pre>
<h3><span id="toc23">2. 基本的な使い方</span></h3>
<pre><code class="language-plaintext">作業メモ.txt
---
プロジェクト: C:\work\my-project
共有フォルダ: \\server\share\documents</code></pre>
<p><strong>シンプル版（パスのみ）：</strong></p>
<ol>
<li>パスの行にカーソルを置く</li>
<li><code>Ctrl+F11</code></li>
<li>モード選択（直下のみ or 再帰的）</li>
<li>結果が右側に表示</li>
<li>保存ダイアログで保存</li>
</ol>
<p><strong>詳細版（サイズ・日時付き）：</strong></p>
<ol>
<li>パスの行にカーソルを置く</li>
<li><code>Ctrl+Shift+F11</code></li>
<li>モード選択（直下のみ or 再帰的）</li>
<li>再帰の場合は警告確認</li>
<li>結果が右側に表示</li>
<li>保存ダイアログで保存</li>
</ol>
<h3><span id="toc24">3. 実践例</span></h3>
<p><strong>シーン1: プロジェクトの構成確認</strong></p>
<pre><code class="language-plaintext">メモ.txt
---
C:\work\api-server</code></pre>
<p>手順：</p>
<ol>
<li>カーソルをパスに置く</li>
<li><code>Ctrl+F11</code> → 直下のみ（全て）</li>
<li>フォルダ構成を確認</li>
</ol>
<p><strong>シーン2: 大量ファイルの棚卸し</strong></p>
<pre><code class="language-plaintext">棚卸し.txt
---
\\server\share\old-projects</code></pre>
<p>手順：</p>
<ol>
<li><code>Ctrl+Shift+F11</code> → 再帰的（ファイルのみ）</li>
<li>警告確認 → 続行</li>
<li>サイズと日時で古いファイルを特定</li>
</ol>
<p><strong>シーン3: 納品物リスト作成</strong></p>
<pre><code class="language-plaintext">納品準備.txt
---
C:\delivery\system-v1.0</code></pre>
<p>手順：</p>
<ol>
<li><code>Ctrl+F11</code> → 再帰的（全て）</li>
<li>ファイルリストを納品書に添付</li>
</ol>
<h2><span id="toc25">package.jsonの設定</span></h2>
<pre><code class="language-json">{
  "contributes": {
    "commands": [
      {
        "command": "myMacros.listFolderContentsSimple",
        "title": "List Folder Contents (Simple)",
        "category": "My Macros"
      },
      {
        "command": "myMacros.listFolderContentsDetailed",
        "title": "List Folder Contents (Detailed)",
        "category": "My Macros"
      }
    ],
    "keybindings": [
      {
        "command": "myMacros.listFolderContentsSimple",
        "key": "ctrl+f11",
        "when": "editorTextFocus"
      },
      {
        "command": "myMacros.listFolderContentsDetailed",
        "key": "ctrl+shift+f11",
        "when": "editorTextFocus"
      }
    ]
  }
}</code></pre>
<h2><span id="toc26">メリット・デメリット</span></h2>
<h3><span id="toc27">メリット</span></h3>
<p><strong>✅ 圧倒的な効率化</strong></p>
<ul>
<li>1キー操作でファイル一覧取得</li>
<li>エクスプローラーでの手作業が不要</li>
<li>コマンドを覚える必要なし</li>
</ul>
<p><strong>✅ 充実の安全装置</strong></p>
<ul>
<li>タイムアウト（60秒）で暴走防止</li>
<li>最大50,000件で自動停止</li>
<li>ネットワークドライブ警告</li>
<li>キャンセル可能なプログレス表示</li>
</ul>
<p><strong>✅ 柔軟な出力モード</strong></p>
<ul>
<li>シンプル版：パスのみ</li>
<li>詳細版：サイズ・日時付き</li>
<li>用途に応じて使い分け</li>
</ul>
<p><strong>✅ 自動除外機能</strong></p>
<ul>
<li><code>node_modules</code>, <code>.git</code>等を自動スキップ</li>
<li>不要なフォルダを除外して高速化</li>
</ul>
<p><strong>✅ 実行履歴の保存</strong></p>
<ul>
<li>実行日時を記録</li>
<li>ファイル名に日時を自動付与</li>
<li>定期的な記録に最適</li>
</ul>
<h3><span id="toc28">デメリット</span></h3>
<p><strong>❌ 巨大フォルダは時間がかかる</strong></p>
<ul>
<li>数万ファイルは数十秒待つ</li>
<li>ネットワークドライブは特に遅い</li>
<li>タイムアウト（60秒）で自動停止</li>
</ul>
<p><strong>❌ リアルタイム監視は非対応</strong></p>
<ul>
<li>スナップショット取得のみ</li>
<li>ファイル変更の自動検知なし</li>
</ul>
<p><strong>❌ アクセス権限エラー</strong></p>
<ul>
<li>権限のないフォルダはスキップ</li>
<li>エラーは通知されない</li>
</ul>
<h2><span id="toc29">トラブルシューティング</span></h2>
<h3><span id="toc30">Q: パスが見つからない</span></h3>
<p><strong>A: パスの記述を確認</strong></p>
<pre><code class="language-plaintext">NG: プロジェクト: C:\work\project（余計な文字）
OK: C:\work\project

NG: "C:\work\project"（引用符付き）→ 自動除去されるが、余計な文字があると失敗

解決策: パスのみの行にする</code></pre>
<h3><span id="toc31">Q: 処理が途中で止まる</span></h3>
<p><strong>A: タイムアウトまたは最大件数に達した</strong></p>
<pre><code class="language-plaintext">タイムアウト: 60秒経過で自動停止
最大件数: 50,000件で自動切り詰め

解決策:
- 直下のみで試す
- 対象フォルダを絞る
- 除外パターンを活用</code></pre>
<h3><span id="toc32">Q: ネットワークドライブが遅い</span></h3>
<p><strong>A: 再帰検索を避ける</strong></p>
<pre><code class="language-plaintext">推奨: 直下のみで取得
非推奨: 再帰的（数分かかる可能性）

解決策:
- まず直下のみで確認
- サブフォルダを個別に処理</code></pre>
<h3><span id="toc33">Q: node_modulesが除外される</span></h3>
<p><strong>A: 除外パターンを変更</strong></p>
<pre><code class="language-typescript">// 除外したくない場合はコードを修正
const EXCLUDE_PATTERNS = [
    // 'node_modules', ← コメントアウト
    '.git',
    '.vscode'
];</code></pre>
<h3><span id="toc34">Q: ファイルが保存できない</span></h3>
<p><strong>A: パスに書き込み権限があるか確認</strong></p>
<pre><code class="language-plaintext">NG: C:\Program Files\...（権限不足）
OK: C:\Users\[ユーザー名]\Documents\...

解決策: 書き込み可能なフォルダに保存</code></pre>
<h2><span id="toc35">まとめ</span></h2>
<p>VSCodeで<strong>カーソル行のフォルダパスから一覧を取得し、別ファイルに出力する</strong>機能を実装しました。</p>
<p><strong>この機能が役立つ人：</strong></p>
<ul>
<li>プロジェクトのファイル構成をドキュメント化したい</li>
<li>共有フォルダの棚卸しをしたい</li>
<li>納品物のファイルリストを作成したい</li>
<li>バックアップ前の記録を残したい</li>
<li>ファイル管理の効率を上げたい</li>
</ul>
<p><strong>特にエクスプローラーでは不可能なファイル一覧のテキスト化を1キーで実現</strong>できるため、実務での生産性向上に大きく貢献します。</p>
<p>プロジェクト管理、作業記録、納品準備、棚卸しなど、様々なシーンで活用できる実用的なツールです。</p>
<p>ぜひ試してみてください！</p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発","b":"オライリージャパン","t":"","d":"https:\/\/m.media-amazon.com","c_p":"","p":["\/images\/I\/51vjj+osAgL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4873119049","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4873119049","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript%20%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript%20%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"vFiVC","s":"s"});</script></p>
<div id="msmaflink-vFiVC">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc36">関連記事</span></h2>
<p>サクラエディタからの移行経緯</p>

<a rel="noopener" href="https://caymezon.com/sakura-to-vscode-macro-migration/" title="サクラエディタからVSCodeへマクロ移行！快適開発環境の構築記録" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/sakura-to-vscode-macro-migration-featured-404add-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/sakura-to-vscode-macro-migration-featured-404add-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/sakura-to-vscode-macro-migration-featured-404add-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/sakura-to-vscode-macro-migration-featured-404add-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/sakura-to-vscode-macro-migration-featured-404add-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">サクラエディタからVSCodeへマクロ移行！快適開発環境の構築記録</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに長年愛用してきたサクラエディタのマクロ機能。便利なJavaScript/VBSマクロを多数作成して日常業務で活用してきましたが、最近のAWS開発やブログ執筆でVSCodeを使う機会が増えてきました。「VSCodeでもサクラエディタの...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.25</div></div></div></div></a>
<p>TypeScriptマクロ開発環境の構築方法</p>

<a rel="noopener" href="https://caymezon.com/vscode-typescript-macro-development-guide/" title="VSCode TypeScriptマクロ開発環境の完全ガイド【セットアップから運用まで】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/01/vscode-typescript-macro-development-guide-featured-418842-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/01/vscode-typescript-macro-development-guide-featured-418842-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/01/vscode-typescript-macro-development-guide-featured-418842-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/01/vscode-typescript-macro-development-guide-featured-418842-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/01/vscode-typescript-macro-development-guide-featured-418842-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">VSCode TypeScriptマクロ開発環境の完全ガイド【セットアップから運用まで】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめにVSCodeでカスタムマクロを作成したいけど、どうやって開発環境を構築すればいいか分からない。そんな悩みを持つ方に向けて、TypeScriptでVSCode拡張機能を開発する環境の構築から、実際にマクロを作成して使えるようにするまで...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.01.25</div></div></div></div></a>
<p>正規表現マッチ抽出ツール</p>

<a rel="noopener" href="https://caymezon.com/vscode-regex-extract-macro/" title="VSCodeで「正規表現マッチ抽出」を実現するTypeScriptマクロ【ログ解析が10倍速くなる】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/vscode-regex-extract-macro-featured-0ffd8c-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/vscode-regex-extract-macro-featured-0ffd8c-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/vscode-regex-extract-macro-featured-0ffd8c-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/vscode-regex-extract-macro-featured-0ffd8c-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/vscode-regex-extract-macro-featured-0ffd8c-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">VSCodeで「正規表現マッチ抽出」を実現するTypeScriptマクロ【ログ解析が10倍速くなる】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめにサーバーログやアプリケーションログを解析する時、こんな悩みありませんか？2024-02-08 10:00:00 INFO: Server started2024-02-08 10:01:00 ERROR: Connection fa...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.08</div></div></div></div></a>
<hr>
<p><strong>タグ:</strong> #VSCode #TypeScript #マクロ #ファイル管理 #生産性向上 #フォルダ一覧</p><p>The post <a href="https://caymezon.com/vscode-folder-list-macro/">VSCodeで「フォルダ一覧取得」を実現するTypeScriptマクロ【ファイル管理が10倍速くなる】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/vscode-folder-list-macro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
