Skip to content

LocalStore.head() fails for existing local folders in Windows - making FsspecStore.exists(), FsspecStore.rm() fail too #555

@keen85

Description

@keen85

Hi,
I noticed the following bug when working with local Windows URL-style paths:

✅ works fine

import fsspec

fs_fsspec = fsspec.filesystem("file")
fs_fsspec.exists("C:/dev/some.txt")  # ✅ file does actually exist
fs_fsspec.exists("C:/dev/foo.txt")  # ✅ file does not actually exist
fs_fsspec.exists("C:/dev/tmp")  # ✅ folder does not actually exist
fs_fsspec.exists("C:/dev")  # ✅ folder does actually exist

❌ fails

from obstore.fsspec import FsspecStore

fs_fsspecstore = FsspecStore("file")
fs_fsspecstore.exists("C:/dev/some.txt")  # ✅ file does actually exist
fs_fsspecstore.exists("C:/dev/foo.txt")  # ✅ file does not actually exist
fs_fsspecstore.exists("C:/dev/tmp")  # ✅ folder does not actually exist
fs_fsspecstore.exists("C:/dev")  # ❌ folder does actually exist
---------------------------------------------------------------------------
GenericError                              Traceback (most recent call last)
Cell In[28], line 5
      3 fs_fsspecstore.exists("C:/dev/foo.txt")  # file does not actually exist
      4 fs_fsspecstore.exists("C:/dev/tmp")  # folder does nor actually exist
----> 5 fs_fsspecstore.exists("C:/dev")  # folder does actually exist

File c:\Users\...\.venv\lib\site-packages\fsspec\asyn.py:118, in sync_wrapper.<locals>.wrapper(*args, **kwargs)
    115 @functools.wraps(func)
    116 def wrapper(*args, **kwargs):
    117     self = obj or args[0]
--> 118     return sync(self.loop, func, *args, **kwargs)

File c:\Users\...\.venv\lib\site-packages\fsspec\asyn.py:103, in sync(loop, func, timeout, *args, **kwargs)
    101     raise FSTimeoutError from return_result
    102 elif isinstance(return_result, BaseException):
--> 103     raise return_result
    104 else:
    105     return return_result

File c:\Users\...\.venv\lib\site-packages\fsspec\asyn.py:56, in _runner(event, coro, result, timeout)
     54     coro = asyncio.wait_for(coro, timeout=timeout)
     55 try:
---> 56     result[0] = await coro
     57 except Exception as ex:
     58     result[0] = ex

File c:\Users\...\.venv\lib\site-packages\fsspec\asyn.py:695, in AsyncFileSystem._exists(self, path, **kwargs)
    693 async def _exists(self, path, **kwargs):
    694     try:
--> 695         await self._info(path, **kwargs)
    696         return True
    697     except FileNotFoundError:

File c:\Users\...\.venv\lib\site-packages\obstore\fsspec.py:503, in FsspecStore._info(self, path, **_kwargs)
    500 store = self._construct_store(bucket)
    502 try:
--> 503     head = await obs.head_async(store, path_no_bucket)
    504     return {
    505         # Required of `info`: (?)
    506         "name": head["path"],
   (...)
    512         "version": head["version"],
    513     }
    514 except FileNotFoundError:

GenericError: Generic LocalFileSystem error: Unable to open file C:\dev: Zugriff verweigert (os error 5)

Debug source:
Generic {
    store: "LocalFileSystem",
    source: UnableToOpenFile {
        source: Os {
            code: 5,
            kind: PermissionDenied,
            message: "Zugriff verweigert",
        },
        path: "C:\\dev",
    },
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions