<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Registry on inetshell</title><link>https://inet.sh/es/tags/registry/</link><description>Recent content in Registry on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/registry/index.xml" rel="self" type="application/rss+xml"/><item><title>Windows: rutas de más de 260 caracteres (LongPathsEnabled) y por qué a veces no basta</title><link>https://inet.sh/es/posts/windows/windows-rutas-largas-longpathsenabled/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/windows/windows-rutas-largas-longpathsenabled/</guid><description>Cómo quitar el límite MAX_PATH de 260 caracteres en Windows 10/11 y Server con la clave de registro LongPathsEnabled o la directiva &amp;#39;Enable Win32 long paths&amp;#39;, qué programas lo respetan (PowerShell 7, .NET, Git con core.longpaths) y cuáles no (cmd, apps viejas), y el prefijo \\?\ como plan B. De regalo: fsutil file createnew para fabricar archivos de prueba del tamaño exacto.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>PowerShell como administrador:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">New-ItemProperty</span> <span class="n">-Path</span> <span class="s2">&#34;HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem&#34;</span> <span class="p">`</span>
</span></span><span class="line"><span class="cl">  <span class="n">-Name</span> <span class="s2">&#34;LongPathsEnabled&#34;</span> <span class="n">-Value</span> <span class="mf">1</span> <span class="n">-PropertyType</span> <span class="n">DWORD</span> <span class="n">-Force</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Reinicia (o al menos los programas afectados). Por directiva de grupo, lo mismo en <strong>Configuración del equipo → Plantillas administrativas → Sistema → Sistema de archivos → Habilitar rutas de acceso largas de Win32</strong>.</p>
<p>Con eso, los programas que <strong>se declaran compatibles</strong> dejan de fallar con rutas de más de 260 caracteres. Los que no, siguen igual: para esos, el prefijo <code>\\?\</code>, <code>subst</code> o <code>robocopy</code>.</p>
<h2 id="el-problema">El problema</h2>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters.
</span></span><span class="line"><span class="cl">error: unable to create file ...: Filename too long          # git
</span></span><span class="line"><span class="cl">System.IO.PathTooLongException                              # .NET
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>MAX_PATH</code> son 260 caracteres contando la letra de unidad y el <code>NUL</code> final. Se pasa fácil con <code>node_modules</code>, clones de git con nombres largos, respaldos que anidan carpetas, o una sincronización que trae una estructura profunda de otro sistema.</p>
<h2 id="qué-hace-la-clave">Qué hace la clave</h2>
<p>Desde Windows 10 1607 (y Server 2016), muchas funciones de archivo de Win32 (<code>CreateFileW</code>, <code>CopyFileW</code>, <code>MoveFileW</code>, <code>FindFirstFileW</code>, <code>CreateDirectoryW</code>…) aceptan rutas hasta unos 32 767 caracteres <strong>si se cumplen dos condiciones</strong>:</p>
<ol>
<li><code>LongPathsEnabled = 1</code> en el registro (o la directiva).</li>
<li>El programa declara <code>longPathAware</code> en su manifiesto.</li>
</ol>
<p>Windows lee el valor una vez por proceso, en la primera llamada a esas funciones. De ahí el reinicio: los procesos que ya estaban corriendo (Explorador, servicios) siguen con el valor viejo.</p>
<table>
  <thead>
      <tr>
          <th>Programa</th>
          <th>¿Respeta rutas largas con la clave activa?</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>PowerShell 7</td>
          <td>Sí</td>
      </tr>
      <tr>
          <td>Windows PowerShell 5.1</td>
          <td>A medias; depende del cmdlet</td>
      </tr>
      <tr>
          <td>.NET (Core) y apps modernas</td>
          <td>Sí</td>
      </tr>
      <tr>
          <td>Git para Windows</td>
          <td>Sí, con <code>git config --system core.longpaths true</code></td>
      </tr>
      <tr>
          <td><code>robocopy</code>, 7-Zip</td>
          <td>Sí (usan <code>\\?\</code> por su cuenta, con o sin clave)</td>
      </tr>
      <tr>
          <td><code>cmd.exe</code> (<code>dir</code>, <code>copy</code>, <code>del</code>)</td>
          <td>No</td>
      </tr>
      <tr>
          <td>Explorador de archivos</td>
          <td>Parcial; sigue tropezando al copiar o borrar</td>
      </tr>
      <tr>
          <td>Aplicaciones antiguas</td>
          <td>No, y no hay forma de obligarlas</td>
      </tr>
  </tbody>
</table>
<p>Comprobar el valor:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Get-ItemProperty</span> <span class="s2">&#34;HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem&#34;</span> <span class="n">-Name</span> <span class="n">LongPathsEnabled</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Prueba rápida en PowerShell 7:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$p</span> <span class="p">=</span> <span class="s2">&#34;C:\t\&#34;</span> <span class="p">+</span> <span class="p">(</span><span class="s2">&#34;a&#34;</span> <span class="p">*</span> <span class="mf">200</span><span class="p">)</span> <span class="p">+</span> <span class="s2">&#34;\&#34;</span> <span class="p">+</span> <span class="p">(</span><span class="s2">&#34;b&#34;</span> <span class="p">*</span> <span class="mf">100</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">New-Item</span> <span class="n">-ItemType</span> <span class="n">Directory</span> <span class="n">-Path</span> <span class="nv">$p</span> <span class="n">-Force</span> <span class="p">|</span> <span class="nb">Out-Null</span>
</span></span><span class="line"><span class="cl"><span class="nb">Get-ChildItem</span> <span class="s2">&#34;C:\t&#34;</span> <span class="n">-Recurse</span> <span class="p">|</span> <span class="nb">Measure-Object</span>
</span></span><span class="line"><span class="cl"><span class="nb">Remove-Item</span> <span class="s2">&#34;C:\t&#34;</span> <span class="n">-Recurse</span> <span class="n">-Force</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="plan-b-cuando-el-programa-no-coopera">Plan B cuando el programa no coopera</h2>
<ul>
<li>
<p><strong>Prefijo <code>\\?\</code></strong>: le dice a Windows que pase la ruta tal cual, sin el límite. Funciona en cualquier versión y sin tocar el registro, pero solo con rutas absolutas y sin <code>.</code>/<code>..</code>. Para UNC: <code>\\?\UNC\servidor\recurso\...</code>.</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl"><span class="k">dir</span> \\?\C:\proyectos\muy\profundo
</span></span><span class="line"><span class="cl"><span class="k">rd</span> /s /q \\?\C:\proyectos\muy\profundo\node_modules
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong>Acortar la ruta</strong>: <code>subst X: C:\proyectos\muy\profundo</code> crea una unidad que empieza de cero; <code>net use</code> hace lo mismo con rutas UNC.</p>
</li>
<li>
<p><strong>Borrar lo que nadie puede borrar</strong>: <code>robocopy C:\vacia C:\ruta\imposible /MIR</code> con una carpeta vacía deja la carpeta destino vacía y ya se puede quitar.</p>
</li>
<li>
<p><strong>Git</strong>: <code>core.longpaths true</code> y, en Windows, clona cerca de la raíz (<code>C:\src\repo</code>) en vez de dentro de <code>Documentos</code>.</p>
</li>
</ul>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>La clave no es un interruptor global.</strong> Es una autorización que cada programa tiene que reclamar; activarla no rompe nada, pero tampoco arregla programas que no la piden.</li>
<li><strong>Reinicio.</strong> Sin él, el Explorador y los servicios siguen con el valor cacheado.</li>
<li><strong>Nombres de componente</strong>: cada carpeta o archivo sigue limitado a 255 caracteres; lo que crece es el total.</li>
<li><strong>Rutas relativas</strong> siempre quedan limitadas a 260, con o sin clave.</li>
<li><strong>Compatibilidad hacia atrás</strong>: un archivo creado en una ruta larga puede no abrirse desde un programa viejo en la misma máquina. Si compartes carpetas con software legacy, mantén las rutas cortas.</li>
</ul>
<h2 id="extra-archivos-de-prueba-del-tamaño-exacto">Extra: archivos de prueba del tamaño exacto</h2>
<p>Para probar transferencias, cuotas o espacio sin buscar un archivo grande:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cmd" data-lang="cmd"><span class="line"><span class="cl">fsutil file createnew C:\temp\dummy-1G.bin 1073741824
</span></span><span class="line"><span class="cl">fsutil file createnew C:\temp\dummy-100M.bin 104857600
</span></span></code></pre></td></tr></table>
</div>
</div><p>Crea al instante un archivo del tamaño indicado en bytes, sin escribir datos (se lee como ceros). Como ventaja, es instantáneo aunque pidas 50 GB; como desventaja, comprime a nada, así que no sirve para medir rendimiento de compresión o deduplicación.</p>
<p>Referencia: <a href="https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation">Maximum Path Length Limitation</a> en Microsoft Learn.</p>
]]></content:encoded></item></channel></rss>