2017-11-29 4 views
1

Ich versuche herauszufinden, wie bereitgestellte Volumes (sie sind an einen Server angeschlossen, und sie sind über afp: // auf meiner Arbeitsstation montiert) und wählen Sie bestimmte Dateitypen und Geben Sie den Pfad, den Dateinamen und die Asset-ID in eine CSV-Datei ein. Die Asset-ID besteht aus den letzten 10 Ziffern des Dateinamens, denen ein "_" vorangestellt ist (Beispiel: afilename_1234567890.mov) Einige Dateien haben keine Asset-ID (ich ignoriere) und einige Dateien haben mehrere "." (zum Beispiel afilename_videofile_23.98_prores_1234567890.mov). Ich kann die Volumes bekommen, die ich brauche (weniger ein Zeitmaschinensicherheitslaufwerk), aber zu versuchen, nach den Dateien zu suchen, ist lästig. Ich habe ein verschiedenes Beispiel angeschaut und die Apple FileManager Dokumentation studiert, aber es gibt nichts Konkretes.Traversed montierten Volumes, um bestimmte Dateitypen zu finden

Ich habe die folgende Routine zu tun, was ich brauche, aber mit der Linie, Let Enumerator = FileManager.enumerator (atPath: url.path)!, Enumerator ist immer leer.

Entweder mache ich eine schlechte Annahme oder ich vermisse definitiv etwas Entscheidendes.

func FindFilesWithAssetIDs() { 

    // Find all the mounted volumes 
    let keys: [URLResourceKey] = [] 
    let volumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: keys, options: [])! 

    var count = 0 
    var volumeCount = volumes.count 
    var volumeItem = 0 

    let filterExtensions = ["mxf", "mov", "mp4", "scc", "cap", "srt", "txt", "rtf", "wav", "mp3", "m2v", "aif"] 

    // Scan all the mounted volumes, one at a time 
    for url in volumes { 

     let components = url.pathComponents 

     if components.count > 1 && components[1] == "Volumes" { 
      if components[2] == "Time Machine Backup" { continue } // Check if the volume is the staff backup disk. If it is, move on to the next volume 

      guard let volumeTypeKey = try? url.resourceValues(forKeys: [.volumeIsLocalKey]) else { return } // Make sure we are scanning the volumes and not any local folders like /private 

      let volumeType: Bool = volumeTypeKey.volumeIsLocal! 

      if volumeType == false { 
       let fileManager = FileManager.default 
       let enumerator = fileManager.enumerator(atPath: url.path)! 

       while let element = enumerator.nextObject() as? String { 
        if element.hasSuffix("mxf") || element.hasSuffix("mov") { // a test. I would much rather use a filterExtension method or a switch statement 
         // do something 
         count += 1 
        } 
       } 

       NSLog(url.path, " ", String(count)) 
       //     NSLog(url.path) 
      } 
     } 

     volumeItem += 1 
    } 
} 

Jede Hilfe würde sehr geschätzt werden.

+0

Duh !! ... Der Schalter "App Sandbox" wurde aus irgendeinem Grund eingeschaltet, wodurch mein Code nicht auf die Netzwerkvolumes zugreifen konnte. Also, wie kann ich die Variable "Element" filtern, die mit "." (unsichtbare Dateien) und gibt es eine bessere Möglichkeit, Dateien mit der Variablen "filterExtensions" zu filtern? Danke – user1462486

+0

die Annahme der Antworten auf Ihre vorherigen Fragen würde mich sehr ermutigen, eine detailliertere Antwort zu geben :-) –

Antwort

0

Ich habe versucht, mit einem Applescript die Volumes zu scannen, aber es gab ein paar Dateien, die trotz ihrer Existenz von Spotlight nicht gefunden werden konnten. Ich habe die Spotlight-Datenbanken auf allen gemounteten Volumes neu aufgebaut, aber kein Glück. Wegen der Fehler griff ich auf Swift zurück.

Am Ende des Tages, bin ich viel weiter mit Swift dann Applescript. Ich habe ein paar Änderungen an den Code gemacht (während let Element = enumerator.nextObject() als? String ist jetzt während let Element = enumerator.nextObject() als? URL) andere Routinen für String < -> URL zu verkürzen Anrufe und so weiter.

Ich schließe diese Frage, wie es gelöst wurde.

Verwandte Themen