Pracuję nad metodą, która identyfikuje rozniecenie z innych zamontowanych dysków na mac użytkowników. Jeśli kindle nie można zidentyfikować po nazwie, moja aplikacja zdecyduje, który zamontowany dysk jest kindle, przeglądając i znajdując dysk zawierający typy plików, których używa kindle (np. .prc, .azw, .mobi, .mbp, itp. ). Oto kod:

    NSLog(@"Scanning every file");
    NSMutableArray *mountedDisks = [[NSMutableArray alloc] init];
    mountedDisks = [workspace mountedRemovableMedia];

    NSMutableArray *subpaths = [[NSMutableArray alloc] init];

    int currentSubpath;
    int proprietaryFilesFound;

    while ([mountedDisks count] > currentDisk && [mountedDisks count] != 0)
    {
        subpaths = [manager subpathsAtPath:[mountedDisks objectAtIndex:currentDisk]];
        currentSubpath = 0;
        proprietaryFilesFound = 0;
        NSLog(@"Entered outer loop");

         while ([subpaths count] > currentSubpath && [subpaths count] != 0 && [[[manager attributesOfFileSystemForPath:[mountedDisks objectAtIndex:currentDisk] error:NULL] objectForKey:NSFileSystemSize] longLongValue] / 1073741824 <= 5 && proprietaryFilesFound < 7)
        {
            NSLog(@"Scanning %@, filetype is %@", [subpaths objectAtIndex:currentSubpath], [[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:NULL] objectForKey:NSFileType]);
            if ([[[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:NULL] objectForKey:NSFileType] isEqual: @"azw"] || [[[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:NULL] objectForKey:NSFileType] isEqual: @"mbp"] || [[[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:NULL] objectForKey:NSFileType] isEqual: @"prc"] || [[[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:NULL] objectForKey:NSFileType] isEqual: @"mobi"])
            {
                proprietaryFilesFound++;
                NSLog(@"Proprietary file found");
            }
            currentSubpath++;
        }
        currentDisk++;
    }

Niestety, gdy uruchamiam następujący wiersz kodu, zwracana jest wartość NULL.

[[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:NULL] objectForKey:NSFileType]

Pracowałem z C++ od dłuższego czasu, ale jestem całkiem nowy w obiektywnym c i kakao, więc każda pomoc byłaby bardzo wdzięczna i z góry przepraszam, jeśli jest to bezsensowne pytanie.

0
Tanner Silva 15 lipiec 2011, 01:13
Domyśliłam się. Nie dodawałem /Volumes/DISKNAME do atrybutówŚcieżki
 – 
Tanner Silva
15 lipiec 2011, 01:30
Wygląda na pracę dla enumeratorAtURL:includingPropertiesForKeys:options:errorHandler: (NSFileManager)
 – 
nielsbot
14 sierpień 2013, 20:41

2 odpowiedzi

Najlepsza odpowiedź

Zamiast przekazywać NULL do parametru błędu, przekaż wskaźnik do NSError i zobacz, jaki błąd otrzymasz. Na przykład:

NSError *error;
[[manager attributesOfItemAtPath:[subpaths objectAtIndex:currentSubpath] error:&error] objectForKey:NSFileType];
NSLog(@"%@", error);
1
highlycaffeinated 15 lipiec 2011, 01:19
Dane wyjściowe: „Nie można otworzyć pliku „system”, ponieważ nie ma takiego pliku”. Underlying Error = (Error Domain = NSPOSIXErrorDomain Code = 2 "Nie można ukończyć operacji. Brak takiego pliku lub katalogu"
 – 
Tanner Silva
15 lipiec 2011, 01:28

Proponuję sprawdzić zmienną "currentSubpath", podczas manipulowania ciągami ścieżek łatwo zapomnieć o (świętym) ukośniku...

0
Benz 14 sierpień 2013, 20:28