Имена файлов, отличных от ASCII, на постоянном томе GCP отображаются неправильно
Я перемещаю наш API ядра.net (2.1) из IIS в контейнеры linux в kubernetes в GCP, и у меня возникают проблемы с извлечением файлов с подключенного файлового сервера, когда имена файлов содержат символы, отличные от ASCII. Подобно этой проблеме GitHub, но это стандартные символы UTF8. åäö
var di = new DirectoryInfo(directory);
if (di.Exists)
{
var dFiles = di.GetFiles("*.pdf", SearchOption.TopDirectoryOnly);
Log.Information($"Files found in {di.Name} : {string.Join(",", dFiles.Select(f => f.Name))}");
//Log.Information($"Length of files found in {di.Name} : {string.Join(",", dFiles.Select(f => f.Length))}");
files.AddRange(dFiles);
}
bost�der.pdf
возвращается, но это должно быть bostäder.pdf
.
Во всех остальных случаях символы обрабатываются правильно, например, при чтении из базы данных. Проблема возникает только при чтении имен файлов. Я получаюFileNotFoundException
при попытке прочитать длину этих файлов. LastWriteTime возвращает 1601-01-01.
Файл находится в хранилище файлов GCP и подключается к кластеру kubernetes с использованием PersistentVolume и PersistentVolumeClaim, а затем подключается к контейнерам.
Я попытался изменить культуру currentthread при запуске этого метода, но безуспешно. Тот же код отлично работает в версии Windows/IIS, используя символические ссылки для указания на общий доступ к файлам.
Если я укажу путь к файлу напрямую, используя новый FileInfo, а не DirectoryInfo.GetFiles
то результирующий объект FileInfo возвращает правильно закодированное имя файла, хотя FileInfo.Length
метод по-прежнему вызывает FileNotFoundException
.
Использовали несколько образов Docker
- mcr.microsoft.com/dotnet/core/aspnet:2.1-bionic
- mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim
Также пытались установить
ENV LC_ALL=sv_SE.UTF-8 \
LANG=sv_SE.UTF-8
в Dockerfile безуспешно. Есть идеи, что еще я могу попробовать?
Редактировать:
Я исследовал дальше, и проблема не в.net, а в смонтированном диске на стручках. Локальные файлы отображаются правильно с использованием ls, а файлы на монтировании - нет. Похоже, это как-то связано со способом установки диска. У меня есть persistantvolume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: fileserver
spec:
capacity:
storage: 1T
accessModes:
- ReadWriteMany
nfs:
path: /mymount
server: 1.2.3.4
и постоянный объем претензии
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fileserver-claim
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1T
который установлен на мои поды с помощью
volumeMounts:
- mountPath: /mnt/fileserver
name: pvc
а также
volumes:
- name: pvc
persistentVolumeClaim:
claimName: fileserver-claim
readOnly: false
в моем deployment.yaml
Изменить 2:
Кажется, проблема с Cloud Filestore, поддерживающим только NFSv3 - есть ли способ прочитать эти файлы с помощью NFSv3