我有一个在数百台服务器上运行的商业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帐户。我已经确认它对文件共享目录有“修改”权限。
哪种服务器配置或权限条件可能会触发此错误?我自己做了很多测试,无法重复测试。
答案 0 :(得分:1)
Directory.Move
在kernel32.dll内部调用MoveFile
: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)
这里很难说,但源文件夹中可能有一个文件无法被您的用户帐户移动。
答案 1 :(得分:0)
你能试试here on SO张贴的答案吗?答案确实克服了对内部功能的限制,并且更加安全。