Валидация в JavaScript: Как создать массив invalidChars, содержащий все запрещенные символы для имен папок/файлов в Windows/Linux?

При разработке файловых менеджеров, загрузчиков файлов или любых форм, где пользователь вводит имя файла или папки, крайне важно валидировать входные данные. Разные операционные системы имеют разные ограничения на допустимые символы в именах файлов и директорий.

## Запрещённые символы в Windows

Windows запрещает использование следующих символов в именах файлов и папок:
— « — обратный слэш (разделитель пути)
— `/` — прямой слэш (тоже разделитель)
— `:` — двоеточие (используется для обозначения диска, например `C:`)
— `*` — звёздочка (маска поиска)
— `?` — знак вопроса (маска поиска)
— `»` — двойная кавычка
— « — знак больше
— `|` — вертикальная черта (пайп)
— Управляющие символы (коды 0–31)

## Запрещённые символы в Linux/Unix

Linux значительно либеральнее, но всё же запрещает:
— `/` — прямой слэш (разделитель пути)
— Нулевой байт ``

Однако на практике рекомендуется также избегать символов, которые имеют специальное значение в оболочке: `*`, `?`, `[`, `]`, `{`, `}`, `!`, `$`, `&`, `’`, `»`, `;`, `(`, `)`, пробел и другие.

## Создание универсального массива invalidChars в JavaScript

javascript
// Запрещённые символы для Windows
const windowsInvalidChars = [‘\’, ‘/’, ‘:’, ‘*’, ‘?’, ‘»‘, », ‘|’];

// Запрещённые символы для Linux (минимум)
const linuxInvalidChars = [‘/’];

// Универсальный массив для обеих систем (рекомендуется)
const invalidChars = [‘\’, ‘/’, ‘:’, ‘*’, ‘?’, ‘»‘, », ‘|’, ‘’];

// Расширенный вариант с управляющими символами Windows (коды 0–31)
const controlChars = Array.from({length: 32}, (_, i) => String.fromCharCode(i));
const invalidCharsExtended = […new Set([…invalidChars, …controlChars])];

// Функция валидации имени файла
function isValidFileName(name) {
if (!name || name.trim() === ») return false;

// Проверка на запрещённые символы
const hasInvalidChar = invalidChars.some(char => name.includes(char));
if (hasInvalidChar) return false;

// Windows: имя не должно заканчиваться на точку или пробел
if (/[. ]$/.test(name)) return false;

// Windows: зарезервированные имена (CON, PRN, AUX, NUL, COM1-9, LPT1-9)
const reservedNames = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(..*)?$/i;
if (reservedNames.test(name)) return false;

return true;
}

// Пример использования
console.log(isValidFileName(‘my_folder’)); // true
console.log(isValidFileName(‘my/folder’)); // false
console.log(isValidFileName(‘file?.txt’)); // false
console.log(isValidFileName(‘CON’)); // false

## Альтернатива через RegExp

javascript
const invalidCharsRegex = /[\/:*?»|x00-x1F]/g;

function sanitizeFileName(name) {
return name.replace(invalidCharsRegex, ‘_’);
}

console.log(sanitizeFileName(‘file:name?.txt’)); // file_name_.txt

## Итог

Для кроссплатформенной совместимости рекомендуется использовать объединённый массив символов, запрещённых в Windows, так как он является более строгим надмножеством ограничений Linux. Это обеспечит корректную работу файлов на обеих системах.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.