dotnet核心File.Move问题

时间:2019-11-21 15:41:04

标签: c# docker .net-core

我的Dockerfile是这个

FROM mcr.microsoft.com/dotnet/core/runtime:3.0

COPY publish/ app/
RUN mkdir -p /in
RUN mkdir -p /tmp

ENTRYPOINT ["dotnet", "app/Watcher.dll"]

然后我用此命令构建映像

docker build -t watcher/sl_user_test:1.1 .

所以,我的docker-compose是这个

watcher.sl_user_test:
  image: watcher/sl_user_test:1.1
  container_name: watcher_sl_user_test
  build: .
  restart: always
  volumes:
    - /var/storage/in:/in:z
    - /var/storage/tmp:/tmp:z

在我的dotnet核心应用程序中,我在/ in文件夹中得到一个文件,并将其移至/ tmp / aaa 代码是这个

string destination = $"/tmp/{Guid.NewGuid()}/git.zip";
new FileInfo(destination).Directory.Create();
File.Move("/in/git.zip", destination, true);

问题是此命令复制文件并且不移动它,为什么? 如果我进入容器,我可以通过bash制作mv,并且可以运行

2 个答案:

答案 0 :(得分:1)

由于要在路径中创建新的GUID,因此保证该目录不存在。因此File.Move将抛出DirectoryNotFoundException

在移动文件之前创建它。

var tmpDir = $"/tmp/{Guid.NewGuid()}";
Directory.CreateDirectory(tmpDir);
File.Move("/in/git.zip", $"{tmpDir}/git.zip", true);

假设您正在执行此操作,如果File.Move方法仅执行复制操作而不是移动操作,则很可能正在使用原始文件。从the docs(在备注部分中):

  

如果您尝试跨磁盘卷移动文件,并且该文件正在使用中,则该文件将复制到目标位置,但不会从源中删除。

答案 1 :(得分:0)

问题是我正在尝试将文件从一个卷移动到另一个。 如果您在GoLang中尝试此代码,则会收到此错误

"rename /dir1/test.txt /dir2/test.txt: invalid cross-device link"

所以,解决方案是

  • 编写您自己的FileMove函数(带有复制和删除源代码)
  • 仅使用一卷

因此,就我而言,

volumes:
  - /var/storage/in:/in:z
  - /var/storage/tmp:/tmp:z

我会做的

volumes:
  - /var/storage/data/:/data:z

/ data中有“ in”和“ tmp”文件夹