2017-01-21 21 views
1

ich eine Funktion erstellt eine Datei zu überprüfen, ob die Datei „test.txt“ existiert:UWP: Überprüfen Sie, erstellen und Daten hinzufügen

Public Function CheckIfFileExists(sFileName As String) As Integer 

    Dim Location As Windows.Storage.StorageFolder = Windows.ApplicationModel.Package.Current.InstalledLocation 
    Dim lstfiles = Location.GetFilesAsync(Search.CommonFileQuery.OrderByName) 
    Dim foundfiles = lstfiles.GetResults 
    Dim bFound As Integer 
    bFound = 0 

    If foundfiles IsNot Nothing Then 

     For Each sFile In foundfiles 
      If sFile.Name = sFileName Then 
       bFound = 1 
       Exit For 
      End If 
     Next 
    End If 
    Return bFound 

End Function 

Nun, wenn ich zum ersten Mal CheckIfFileExists nennen (Dateiname) in meine Hauptfunktion , z.B

CheckIfFileExists("test.txt") 

, es gibt eine „System.Runtime.InteropServices.COMException“ sagen, dass ich die Methode zu einem unerwarteten Zeitpunkt nenne.

Exception thrown: 'System.UnauthorizedAccessException' in mscorlib.ni.dll 

Ist es mit der Tatsache verbunden, dass ich asynchrone Funktion in einer synchronen Funktion verwende?

Wenn ja, wie muss ich meine Funktion ändern, um asynchron zu arbeiten?

Danke!

+0

Bitte geben Sie eine [MCVE]. – IInspectable

+0

modifizierte Frage, um die Anforderungen zu erfüllen – bluefox

+0

Dies ist kein [mcve]. – IInspectable

Antwort

0

Is it related to the fact that I use asynchronous function in a synchronous function?

Ja, Sie sollten warten immer die asynchrone GetFilesAsync Methode:

Public Async Function CheckIfFileExists(sFileName As String) As Task(Of Integer) 

    Dim Location As Windows.Storage.StorageFolder = Windows.ApplicationModel.Package.Current.InstalledLocation 
    Dim lstfiles = Await Location.GetFilesAsync(Search.CommonFileQuery.OrderByName) 
    Dim foundfiles = lstfiles 
    Dim bFound As Integer 
    bFound = 0 

    If foundfiles IsNot Nothing Then 
     For Each sFile In foundfiles 
      If sFile.Name = sFileName Then 
       bFound = 1 
       Exit For 
      End If 
     Next 
    End If 
    Return bFound 
End Function 

Und die CheckIfFileExists Methode:

Dim b As Boolean = Await CheckIfFileExists("test.txt") 
+0

Die Verwendung der oben beschriebenen Funktion löst den vielgeliebten Fehler aus: ** .... CheckIfFileExists (System.String) 'hat in seiner Signatur einen Parameter vom Typ' System.Threading.Tasks.Task '. Obwohl dieser generische Typ kein gültiger Windows-Runtime-Typ ist, implementieren der Typ oder seine generischen Parameter Schnittstellen, die gültige Windows-Runtime-Typen sind. Erwägen Sie stattdessen, den Typ "Task" in der Methodensignatur in einen der folgenden Typen zu ändern: .... ** – bluefox

+0

Ich habe im Web recherchiert und herausgefunden, dass ich die von Ihnen vorgeschlagene Funktion in eine nicht asynchrone Funktion einschließen muss , hier beschrieben: [link] (https://marcominerva.wordpress.com/2013/03/21/how-to-expose-async-methods-in-a-windows-runtime-component/). Zusätzlich muss 'CheckIfFileExists' als PRIVATE gesetzt werden !! – bluefox

Verwandte Themen