Directory.Move结果目录不为空错误

时间:2016-11-04 22:40:58

标签: c# asp.net .net system.io.directory

我有一个在数百台服务器上运行的商业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帐户。我已经确认它对文件共享目录有“修改”权限。

哪种服务器配置或权限条件可能会触发此错误?我自己做了很多测试,无法重复测试。

2 个答案:

答案 0 :(得分:1)

Directory.Move在kernel32.dll内部调用MoveFilehttps://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张贴的答案吗?答案确实克服了对内部功能的限制,并且更加安全。