{"record":{"id":"77d0936cfd5d7635","repo":"Comfy-Org/ComfyUI","slug":"folder-name-must-name-a-subfolder-of-the-datasets","errorCode":null,"errorMessage":"folder_name must name a subfolder of the datasets directory, e.g. 'my_dataset'.","messagePattern":"folder_name must name a subfolder of the datasets directory, e\\.g\\. 'my_dataset'\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_extras/nodes_dataset.py","lineNumber":122,"sourceCode":"\n                child_key = (child_st.st_dev, child_st.st_ino)\n                if child_key not in seen_dirs:\n                    kept_subdirs.append(name)\n\n            subdirs[:] = kept_subdirs\n\n    return sorted(found)\n\n\ndef get_dataset_save_dir(folder_name):\n    \"\"\"Resolve the folder to save a new dataset into, inside the default root.\n\n    The folder is not created here; callers makedirs after validation.\n    \"\"\"\n    root = folder_paths.get_folder_paths(\"datasets\")[0]\n    target = secure_subfolder_path(root, folder_name)\n    if os.path.realpath(target) == os.path.realpath(root):\n        raise ValueError(\"folder_name must name a subfolder of the datasets directory, e.g. 'my_dataset'.\")\n    return target\n\n\ndef get_dataset_dir(folder_name):\n    \"\"\"Find an existing dataset folder by relative name across all dataset roots.\"\"\"\n    roots = folder_paths.get_folder_paths(\"datasets\")\n    for root in roots:\n        target = secure_subfolder_path(root, folder_name)\n        if os.path.realpath(target) == os.path.realpath(root):\n            raise ValueError(\"folder_name must name a subfolder of the datasets directory, e.g. 'my_dataset'.\")\n        if os.path.isdir(target):\n            return target\n    raise ValueError(f\"Dataset folder {folder_name!r} not found in: {', '.join(roots)}\")\n\n\nVALID_VIDEO_EXTENSIONS = [\".mp4\", \".avi\", \".mov\", \".webm\", \".mkv\", \".flv\"]\n\n","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_extras/nodes_dataset.py#L104-L140","documentation":"get_dataset_save_dir resolves the requested folder inside the first configured datasets root and then rejects the degenerate case where the resolved target equals the root itself. A folder_name of '' or '.' resolves to the root, and saving a dataset 'into the root' would scatter its files among all other datasets, so the function demands a real subfolder name.","triggerScenarios":"Calling the save-dir resolver with folder_name = '', '.', or any name that realpath-normalizes to the datasets root (e.g. 'sub/../' on some filesystems). Note this fires after secure_subfolder_path, so traversal names hit the earlier containment error instead.","commonSituations":"An empty string widget value reaching the node; string manipulation upstream that strips the folder name to nothing; users leaving the folder field blank expecting a default.","solutions":["Provide a concrete subfolder name, e.g. 'my_new_dataset'.","Default the widget value in the frontend or upstream logic so it is never empty.","Trim slashes: 'my_dataset/' is fine but '' or '.' is not."],"exampleFix":"# before\nfolder_name = \"\"\n# after\nfolder_name = \"my_dataset\"","handlingStrategy":"validation","validationCode":"def concrete_folder_name(name: str) -> str:\n    name = (name or \"\").strip().strip(\"/\")\n    if not name or name == \".\":\n        raise ValueError(\"folder_name must be a subfolder name\")\n    return name","typeGuard":"def is_concrete_name(name) -> bool:\n    return isinstance(name, str) and name.strip().strip(\"/\") not in (\"\", \".\")","tryCatchPattern":null,"preventionTips":["Give the folder widget a non-empty default.","Trim trailing slashes and reject '.'/'..' in adapters.","Offer choices from list_dataset_folders() in the UI."],"tags":["dataset","validation","filesystem","comfyui"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}