F# System.IO.DeleteFile引发UnauthorizedAccessException

F# System.IO.DeleteFile引发UnauthorizedAccessException,f#,f#-fake,F#,F# Fake,我试图使用System.IO.DeleteFile删除一个文件,但它莫名其妙地抛出了UnauthorizedAccessException。我意识到这已经被问过很多次了。我已经看过了所有我能找到的问题,但没有一个答案是适用的。我碰巧用的是假的,但问题似乎更一般 以下是我的整个build.fsx: // include Fake lib #r @"packages/FAKE/tools/FakeLib.dll" open Fake open System.IO Target "Default"

我试图使用System.IO.DeleteFile删除一个文件,但它莫名其妙地抛出了UnauthorizedAccessException。我意识到这已经被问过很多次了。我已经看过了所有我能找到的问题,但没有一个答案是适用的。我碰巧用的是假的,但问题似乎更一般

以下是我的整个build.fsx:

// include Fake lib
#r @"packages/FAKE/tools/FakeLib.dll"
open Fake
open System.IO

Target "Default" (fun _ ->
    DeleteFile "./Newtonsoft.Json.dll" |> ignore
)

RunTargetOrDefault "Default"
我得到这个异常运行
Fsi.exe build.fsx

System.UnauthorizedAccessException: Access to the path './Newtonsoft.Json.dll' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileInfo.Delete()
   at FSI_0001.clo@6.Invoke(Unit _arg1) in c:\Apache24\htdocs\IS4C\pos\is4c-nf\scale-drivers\drivers\NewMagellan\build2.fsx:line 7
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\fake\src\app\FakeLib\TargetHelper.fs:line 483
如果我从同一个命令提示符下运行
del Newtonsoft.Json.dll
,该文件删除得很好

这似乎不是权限问题。该文件不是只读或隐藏的。除非我的实际构建文件以某种方式打开了该文件的额外句柄,否则我看不出它将如何在另一个进程中打开


这些似乎是这个问题的三个标准答案。是否还有其他答案?

文件可能由正在运行的进程保存。根据这只发生在假脚本中的事实判断,我认为脚本本身可能就是这个过程。考虑到这一点,我想说,FAKE本身很可能正在使用该DLL。请注意,我没有设法重现您的问题:类似的
build.fsx
在我的框上运行,删除
Newtonsoft.Json.DLL
时没有任何问题,因此它与
FAKE
库依赖项无关。我建议您通过显示
directory.GetCurrentDirectory()来发现并发布您的运行时当前目录
,因为到dll的两个相对路径与我从常规
FAKE
nuget安装中所期望的不一致。您可以在进程持有的appdomains中迭代加载的程序集,以查看谁加载了dll。有一些工具可以让您找到哪些进程打开了文件(sys内部的Process Explorer就是其中之一)。在windows中,由于文件被打开而无法删除文件时,有一件事往往会起作用,那就是重命名往往会起作用。也许你可以做点什么。FAKE是通过paket而不是nuget安装的。实际上,我使用FAKE在当前工作目录中构建了Newtonsoft.Json.dll。在./packages/FAKE/Tools/Newtonsoft.Json.dll中还有另一个副本,大概是我第一次运行构建时使用的。我猜在后续的运行中,FAKE使用的是我试图[re-]构建的dll,而不是与包一起安装的dll。