Как предполагается в другом месте, это обычно не то, что вы хотите сделать. Обычно лучше создать временный файл, используя безопасный метод, такой как File.createTempFile ().
Вы не должны делать это с белым списком и хранить только «хорошие» символы. Если файл состоит только из китайских иероглифов, то вы удалите из него все. По этой причине мы не можем использовать белый список, мы должны использовать черный список.
Linux в значительной степени допускает все, что может быть настоящей болью. Я бы просто ограничил Linux тем же списком, что и Windows, чтобы избежать головной боли в будущем.
Используя этот фрагмент C # в Windows, я создал список символов, которые недопустимы в Windows. В этом списке гораздо больше символов, чем вы думаете (41), поэтому я бы не советовал пытаться создать свой собственный список.
foreach (char c in new string(Path.GetInvalidFileNameChars()))
{
Console.Write((int)c);
Console.Write(",");
}
Вот простой Java-класс, который «очищает» имя файла.
public class FileNameCleaner {
final static int[] illegalChars = {34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
static {
Arrays.sort(illegalChars);
}
public static String cleanFileName(String badFileName) {
StringBuilder cleanName = new StringBuilder();
for (int i = 0; i < badFileName.length(); i++) {
int c = (int)badFileName.charAt(i);
if (Arrays.binarySearch(illegalChars, c) < 0) {
cleanName.append((char)c);
}
}
return cleanName.toString();
}
}
EDIT:
Как предположил Стивен, вам, вероятно, также следует убедиться, что эти обращения к файлам происходят только в разрешенном вами каталоге.
Следующий ответ содержит пример кода для создания пользовательского контекста безопасности в Java и последующего выполнения кода в этой «песочнице».
Как создать безопасную изолированную программную среду JEXL (для сценариев)?