基于类的streamReader和xmlReader会锁定文件,但功能不会

我正在将一些基于函数的XML读取器代码重构为类方法,并看到一些问题。使用该功能,我可以运行测试并验证XML是否正确加载,然后更改XML并测试错误情况。但是这种基于类的方法由于“在另一个程序中打开了文件”而失败,这迫使我在修改XML之前关闭控制台。 最初,我直接在xmlReader中使用路径。所以我移到了XMLReader的StreamReader输入中。我什至玩了一个全新的xmlDocument并将导入的XML的根节点导入该新的xmlDocument中。没有办法。 我怀疑基于函数的版本起作用的原因是因为xmlReader变量是本地作用域,所以当函数完成时它超出了作用域。但是我在那儿抓稻草。我还读到垃圾收集可能是一个问题,因此我在“处置”之后立即添加了[system.gc]::Collect(),但仍然没有变化。

class ImportXML {
    # Properties
    [int]$status = 0
    [xml.xmlDocument]$xml = ([xml.xmlDocument]::New())
    [collections.arrayList]$message = ([collections.arrayList]::New())

    # Methods
    [xml.xmlDocument] ImportFile([string]$path) {
        $importError = $false
        $importFile = ([xml.xmlDocument]::New())
        $xmlReaderSettings = [xml.xmlReaderSettings]::New()
        $xmlReaderSettings.ignoreComments = $true
        $xmlReaderSettings.closeInput = $true
        $xmlReaderSettings.prohibitDtd = $false
        try {
            $streamReader = [io.streamReader]::New($path)
            $xmlreader = [xml.xmlreader]::Create($streamReader,$xmlReaderSettings)
            [void]$importFile.Load($xmlreader)
            $xmlreader.Dispose
            $streamReader.Dispose
        } catch {
            $exceptionName = $_.exception.GetType().name
            $exceptionmessage = $_.exception.message
            switch ($exceptionName) {
                Default {
                    [void]$this.message.Add("E_$($exceptionName): $exceptionmessage")
                    $importError = $true
                }
            }
        }

        if ($importError) {
            $importFile = $null
        }

        return $importFile
    }
}

class SettingsXML : ImportXML {
    # Constructor
    SettingsXML([string]$path){
        if ($this.xml = $this.ImportFile($path)) {
            Write-Host "$path!"
        } else {
            Write-Host "$($this.message)"
        }
    }
}

$settingsPath = '\\Mac\iCloud Drive\Px Tools\Dev 4.0\Settings.xml'
$settings = [SettingsXML]::New($settingsPath)

编辑:  我也尝试了FileRead而不是StreamReader,并使用ReadWrite的FileShare,就像这样

$fileMode = [System.IO.FileMode]::Open
$fileaccess = [System.IO.Fileaccess]::Read
$fileShare = [System.IO.FileShare]::ReadWrite
$fileStream = New-Object -TypeName System.IO.FileStream $path,$fileMode,$fileaccess,$fileShare

仍然没有运气。

hezhen2009 回答:基于类的streamReader和xmlReader会锁定文件,但功能不会

我认为您在Dispose的右边,但实际上并没有调用该方法-您只是在引用它,然后什么也不做用它...

比较:

PS> $streamReader = [io.streamReader]::New(".\test.xml");
PS> $streamReader.Dispose

OverloadDefinitions
-------------------
void Dispose()
void IDisposable.Dispose()
PS> _

使用

PS> $streamReader = [io.streamReader]::New(".\test.xml");
PS> $streamReader.Dispose()
PS> _

您需要在方法名称后添加一些(),以便您的代码变为:

$xmlreader.Dispose()
$streamReader.Dispose()

然后应该释放文件锁定。

本文链接:https://www.f2er.com/3139561.html

大家都在问