usebruno/bruno · error · Error
directory: ${dir} already exists
Error message
directory: ${dir} already exists What it means
Thrown by createDirectory when fs.existsSync(dir) is true. Unlike mkdirSync(recursive), createDirectory intentionally refuses to overwrite an existing directory — it is a create-not-overwrite primitive.
Source
Thrown at packages/bruno-electron/src/utils/filesystem.js:162
const hasRequestExtension = (filename, format = null) => {
if (!filename || typeof filename !== 'string') return false;
if (format) {
const ext = format === 'yml' ? 'yml' : 'bru';
return filename.toLowerCase().endsWith(`.${ext}`);
}
return ['bru', 'yml'].some((ext) => filename.toLowerCase().endsWith(`.${ext}`));
};
const createDirectory = async (dir) => {
if (!dir) {
throw new Error(`directory: path is null`);
}
if (fs.existsSync(dir)) {
throw new Error(`directory: ${dir} already exists`);
}
return fs.mkdirSync(dir);
};
const browseDirectory = async (win) => {
const { filePaths } = await dialog.showOpenDialog(win, {
properties: ['openDirectory', 'createDirectory']
});
if (!filePaths || !filePaths[0]) {
return false;
}
const resolvedPath = path.resolve(filePaths[0]);
return isDirectory(resolvedPath) ? resolvedPath : false;
};
View on GitHub (pinned to 9bdd81c7bd)
Solutions
- Check existence first or switch to a unique-name strategy (generateUniqueName).
- If the existing directory is the intended target, skip creation rather than treating it as an error.
- Use fs.mkdirSync(dir, { recursive: true }) directly when overwrite-equivalent idempotency is desired.
Example fix
// before
if (fs.existsSync(dir)) {
throw new Error(`directory: ${dir} already exists`);
}
return fs.mkdirSync(dir);
// after: idempotent when caller signals reuse
const createDirectory = async (dir, { existsOk = false } = {}) => {
if (!dir) throw new Error('directory: path is null');
if (fs.existsSync(dir)) {
if (existsOk) return dir;
throw new Error(`directory: ${dir} already exists`);
}
return fs.mkdirSync(dir);
}; Defensive patterns
Strategy: validation
Validate before calling
async function createDirectoryIdempotent(dir) {
if (fs.existsSync(dir)) return dir;
return createDirectory(dir);
} Type guard
function directoryMissing(dir) {
return !fs.existsSync(dir);
} Try / catch
try {
await createDirectory(dir);
} catch (err) {
if (err.message.endsWith('already exists')) return dir; // idempotent success
throw err;
} Prevention
- Check existence first if you want idempotent semantics.
- Use generateUniqueName when the name may collide.
- Reserve createDirectory for create-not-overwrite intent only.
When it happens
Trigger: Calling createDirectory for a path that already exists on disk; two concurrent creations racing on the same path; retry after a partial run that already made the folder.
Common situations: Re-running an import/create after a previous success; duplicate folder name; a sync from git already populated the directory.
Related errors
- collection: ${collectionPath} already exists
- Cannot copy, ${path.basename(source)} already exists in ${pa
- Failed to export ${environmentType} environments.
- Failed to process ${parsedFile.fileName}: ${err.message}
- Failed to parse the file – ensure it is valid JSON or YAML
AI-assisted analysis of usebruno/bruno@9bdd81c7bd (2026-08-13).
Data as JSON: /api/errors/2603e71f318b53a5.
Report an issue: GitHub.