1

我有一个在数百台服务器上运行的商业 ASP.NET 应用程序。当应用程序尝试移动通过 UNC 语法访问的文件共享上的目录时,一位客户遇到以下错误。

System.IO.IOException: The directory is not empty.

堆栈跟踪:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.InternalMove(String sourceDirName, String destDirName, Boolean checkHost)
at GalleryServer.Business.AlbumSaveBehavior.PersistToFileSystemStore(IAlbum album)
at GalleryServer.Business.AlbumSaveBehavior.Save()
at GalleryServer.Business.GalleryObject.Save()
at GalleryServer.Business.Album.MoveTo(IAlbum destinationAlbum)
at GalleryServer.Web.Controller.AlbumController.TransferToAlbum(Int32 destinationAlbumId, GalleryItem[] itemsToTransfer, GalleryAssetTransferType  transferType, GalleryItem[] createdGalleryItems)
at GalleryServer.Web.Api.AlbumsController.TransferTo(Int32 destinationAlbumId, GalleryItem[] itemsToTransfer, GalleryAssetTransferType transferType)

代码如下所示(简化):

var sourceDir = @"\\server\storage\folder1";
var destDir = @"\\server\storage\folder2";

System.IO.Directory.Move(sourceDir, destDir);

我应该注意,当目录为空时代码会成功。当它包含文件时它应该可以工作,实际上它对其他客户也有效。

ASP.NET 应用程序在 IIS 中使用应用程序池标识的 AD 帐户运行。我已经确认它对文件共享目录具有“修改”权限。

什么样的服务器配置或权限条件会触发此错误?我自己进行了许多测试,但无法重现。

4

2 回答 2

1

Directory.MoveMoveFile在 kernel32.dll内部调用: https ://msdn.microsoft.com/en-us/library/windows/desktop/aa365239(v=vs.85).aspx

这会导致系统错误 0x91 ( https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx )

从这里很难判断,但源文件夹中可能有一个文件无法通过您的用户帐户移动。

于 2016-11-04T23:02:28.017 回答
0

您可以尝试在 SO 上发布的答案吗?答案确实克服了对内部功能的限制,并且更安全。

于 2016-11-05T06:56:09.727 回答