Arbeta med File-objekt i AIRAdobe AIR 1.0 och senare Ett File-objekt är en pekare till en fil eller en katalog i filsystemet. Klassen File utökar klassen FileReference. Klassen FileReference, som finns i både Adobe® Flash® Player och AIR, utgör en pekare till en fil, men klassen File lägger till egenskaper och metoder som av säkerhetsskäl inte visas i Flash Player (i en SWF-fil som körs i en webbläsare). Om klassen FileDu kan använda klassen File för följande:
När ett File-objekt pekar på en filsökväg, kan du använda den om du vill läsa och skriva fildata, med hjälp av klassen FileStream. Ett File-objekt kan peka på sökvägen till en fil eller katalog som inte längre finns. Du kan använda sådana File-filobjekt när du skapar en fil eller katalog. Sökvägar till File-objektVarje File-objekt har två egenskaper som definierar sökvägen:
Klassen File inkluderar statiska egenskaper som du använder för att peka på standardkataloger i Mac OS, Windows och Linux. Bland dessa egenskaper finns:
Obs! Om plattformen inte definierar några standardplatser för skrivbords-, dokument- eller användarkataloger kan File.documentsDirectory, File.desktopDirectory och File.userDirectory referera till samma katalog.
Dessa egenskaper har olika värden på olika operativsystem. Mac och Windows har till exempel olika systemsökvägar till användarens skrivbordskatalog. Egenskapen File.desktopDirectory pekar däremot på en lämplig katalogsökväg på alla plattformar. Om du vill skriva program som fungerar bra på olika plattformar använder du de här egenskaperna som utgångspunkt för att referera till andra kataloger och filer som används av programmet. Sedan använder du metoden resolvePath() för att närmare specificera sökvägen. Den här koden pekar till exempel på filen preferences.xml i programmets katalog: var prefsFile:File = File.applicationStorageDirectory; prefsFile = prefsFile.resolvePath("preferences.xml"); Även om du kan använda klassen File för att peka på en viss sökväg kan det leda till att programmet inte fungerar på alla plattformar. Sökvägen C:\Documents and Settings\joe\ fungerar till exempel bara på Windows. Därför är det bäst att använda de statiska egenskaperna i klassen File, som File.documentsDirectory.
De faktiska systemsökvägarna för dessa kataloger varierar beroende på operativsystem och datorkonfiguration. Sökvägarna i den här tabellen är exempel. Du bör alltid använda lämpliga statiska egenskaper för klassen File för att referera till de här katalogerna så att programmet fungerar som det ska oavsett plattform. I ett riktigt AIR-program hämtas värdena för applicationID och filename (som visas i tabellen) från programbeskrivningsfilen. Om du anger ett utgivar-ID i programbeskrivningsfilen läggs utgivar-ID:t till program-ID:t i dessa sökvägar. Värdet på userName är kontonamnet för den användare som installerar programmet. Katalogvy för AIR for TV-programFör att skydda systemfilerna på enheter med AIR for TV kan ett AIR-program bara komma åt en begränsad uppsättning kataloger. AIR for TV hindrar programmet från att komma åt några andra kataloger. Dessutom isolerar AIR for TV varje användares egna data för varje AIR-program. AIR-programmet använder katalognamn som bara är avsedda för ActionScript 3.0-användning. De här namnen representerar inte några verkliga kataloger på enheten. AIR for TV mappar dessa ActionScript 3.0-katalognamn till verkliga kataloger på enheten. Den här mappningen ser till AIR for TV-program inte kommer åt lokala filer som de inte äger, vare sig det är av misstag eller av andra skäl. ActionScript 3.0-katalognamnen är:
Om ett program försöker få tillgång till en skyddad katalog genereras ett undantagsfel som ActionScript-koden kan hantera. I följande tabell visas File.nativePath-värdena för olika File-egenskaper och -metoder. Värdena speglar programmets begränsade vy av enhetens filsystem.
Ta även hänsyn till beteendet för följande metoder på enheter med AIR for TV:
Peka ett File-objekt mot en katalogDu kan ställa in ett File-objekt på två sätt så att det pekar mot en katalog. Peka mot användarens hemkatalogDu kan peka ett File-objekt mot användarens hemkatalog. Följande kod ställer in ett File-objekt att peka mot en AIR Test-underkatalog till hemkatalogen: var file:File = File.userDirectory.resolvePath("AIR Test"); Peka mot användarens dokumentkatalogDu kan peka ett File-objekt mot användarens dokumentkatalog. Följande kod ställer in ett File-objekt att peka mot en AIR Test-underkatalog till dokumentkatalogen: var file:File = File.documentsDirectory.resolvePath("AIR Test"); Peka mot skrivbordskatalogenDu kan peka ett File-objekt mot skrivbordet. Följande kod ställer in ett File-objekt att peka mot en AIR Test-underkatalog till skrivbordet: var file:File = File.desktopDirectory.resolvePath("AIR Test"); Peka mot programlagringskatalogenDu kan peka ett File-objekt mot programlagringskatalogen. För alla AIR-program finns det en unik associerad sökväg som definierar programlagringskatalogen. Den här katalogen är unik för varje program och användare. Du kan använda den här katalogen för att lagra användarspecifika, programspecifika data (till exempel användardata eller inställningsfiler). Följande kod pekar ett File-objekt mot en inställningsfil, prefs.xml, som finns i programlagringskatalogen: var file:File = File.applicationStorageDirectory; file = file.resolvePath("prefs.xml"); Sökvägen för programlagringskatalogen baseras vanligtvis på användarnamnet och program-ID:t. Följande filsystemplatser visas här för att underlätta felsökning av programmet. Du bör alltid använda egenskapen File.applicationStorage eller URI-schemat app-storage: för att lösa filkonflikter i den här katalogen:
Obs! Om ett program har ett utgivar-ID används även detta utgivar-ID som en del av sökvägen till programlagringskatalogen.
URL:en (och egenskapen url) för ett File-objekt som har skapats med File.applicationStorageDirectory använder URL-schemat app-storage (se URL-scheman som stöds i AIR), så här: var dir:File = File.applicationStorageDirectory; dir = dir.resolvePath("preferences"); trace(dir.url); // app-storage:/preferences Peka mot programkatalogenDu kan peka ett File-objekt mot katalogen där programmet installerades, som också kallas för programkatalogen. Du kan referera till den här katalogen med hjälp av egenskapen File.applicationDirectory. Du kan använda den här katalogen för att undersöka programbeskrivningsfilen eller andra resurser som har installerats med programmet. Följande kod pekar ett File-objekt mot en katalog med namnet images i programkatalogen: var dir:File = File.applicationDirectory; dir = dir.resolvePath("images"); URL:en (och egenskapen url) för ett File-objekt som har skapats med File.applicationDirectory använder URL-schemat app (se URL-scheman som stöds i AIR), så här: var dir:File = File.applicationDirectory; dir = dir.resolvePath("images"); trace(dir.url); // app:/images Obs! I Android är filerna i programpaketet inte tillgängliga via nativePath. Egenskapen nativePath är en tom sträng. Använd alltid URL:en för att komma åt filer i programkatalogen i stället för en systemsökväg.
Peka på filsystemets rotMetoden File.getRootDirectories() visar alla rotvolymer, till exempel C: och monterade volymer på en Windows-dator. I Mac OS och Linux returnerar den här metoden alltid datorns unika rotkatalog (katalogen "/"). Metoden StorageVolumeInfo.getStorageVolumes() ger mer detaljerad information om monterade lagringsvolymer (se Arbeta med lagringsvolymer). Obs! Filsystemets rot kan inte läsas i Android. Ett File-objekt som refererar till katalogen med systemsökvägen ”/” returneras, men egenskaperna för det objektet har inte korrekta värden. spaceAvailable är till exempel alltid 0.
Peka mot en viss katalogDu kan peka File-objektet mot en viss katalog genom att ange egenskapen nativePath för File-objektet, som i följande exempel (i Windows): var file:File = new File(); file.nativePath = "C:\\AIR Test"; Viktigt! Om du pekar på en explicit sökväg på det här sättet kan det innebära att koden inte fungerar på alla plattformar. Det föregående exemplet fungerar till exempel bara på Windows. Du kan använda de statiska egenskaperna i File-objektet, som File.applicationStorageDirectory, för att leta upp en katalog som fungerar på alla plattformar. Använd sedan metoden resolvePath() (se nästa avsnitt) för att navigera till en relativ sökväg. Navigera till relativa sökvägarMed metoden resolvePath() kan du hämta en sökväg som är relativ till en annan angiven sökväg. Följande kod ställer in ett File-objekt att peka mot underkatalogen ”AIR Test” till användarens hemkatalog: var file:File = File.userDirectory; file = file.resolvePath("AIR Test"); Du kan också använda egenskapen url för ett File-objekt om du vill peka det mot en katalog utifrån en URL-sträng, så här: var urlStr:String = "file:///C:/AIR Test/"; var file:File = new File() file.url = urlStr; Mer information finns i Ändra File-sökvägar. Låta användarna bläddra för att välja en katalogKlassen File omfattar metoden browseForDirectory(), som visar en systemdialogruta där användaren kan välja en katalog och tilldela den till objektet. Metoden browseForDirectory() är asynkron. Den skickar en select-händelse om användaren väljer en katalog och klickar på knappen Öppna, eller skickar en cancel-händelse om användaren klickar på knappen Avbryt. Följande kod gör så att användaren kan välja en katalog och returnerar katalogsökvägen när katalogen väljs: var file:File = new File(); file.addEventListener(Event.SELECT, dirSelected); file.browseForDirectory("Select a directory"); function dirSelected(e:Event):void { trace(file.nativePath); } Obs! I Android stöds metoden browseForDirectory() inte. Om du anropar den här metoden har det ingen effekt alls, utan då skickas en cancel-händelse direkt. Om du vill att användaren ska kunna välja en katalog måste du använda en anpassad, programdefinierad dialogruta i stället.
Peka mot den katalog som programmet anropas frånDu kan hämta den katalogplats som programmet anropas från genom att kontrollera egenskapen currentDirectory för InvokeEvent-objektet som skickas när programmet anropas. Mer information finns i Hämta kommandoradsargument. Peka ett File-objekt mot en filDu kan ställa in filen som ett File-objekt pekar mot på olika sätt. Peka mot en explicit filsökvägViktigt! Om du pekar på en explicit sökväg kan det innebära att koden inte fungerar på alla plattformar. Sökvägen C:/foo.txt fungerar till exempel bara på Windows. Du kan använda de statiska egenskaperna i File-objektet, som File.applicationStorageDirectory, för att leta upp en katalog som fungerar på alla plattformar. Använd sedan metoden resolvePath() (se Ändra File-sökvägar) för att navigera till en relativ sökväg. Du kan använda egenskapen url för ett File-objekt om du vill peka det mot en fil eller katalog utifrån en URL-sträng, så här: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File() file.url = urlStr; Du kan också skicka URL:en till konstruktorfunktionen File(), så här: var urlStr:String = "file:///C:/AIR Test/test.txt"; var file:File = new File(urlStr); Egenskapen url returnerar alltid den URI-kodade versionen för URL:en (blanksteg ersätts till exempel med "%20): file.url = "file:///c:/AIR Test"; trace(file.url); // file:///c:/AIR%20Test Du kan också använda egenskapen nativePath för ett File-objekt om du vill ställa in en explicit sökväg. När följande kod körs på en Windows-dator ställs ett File-objekt in på att testa filen test.txt i AIR-underkatalogen Test på enhet C: var file:File = new File(); file.nativePath = "C:/AIR Test/test.txt"; Du kan också skicka den här sökvägen till konstruktorfunktionen File(), så här: var file:File = new File("C:/AIR Test/test.txt"); Använd snedstreck (/) som sökvägsavgränsare för egenskapen nativePath. På Windows kan du även använda omvänt snedstreck (\), men då kommer programmet inte att fungera på alla plattformar. Mer information finns i Ändra File-sökvägar. Gå igenom filer i en katalogMed metoden getDirectoryListing() för ett File-objekt kan du hämta en array med File-objekt som pekar mot filer och underkataloger på en katalogs rotnivå. Mer information finns i Gå igenom kataloger. Låta användarna bläddra för att välja en filKlassen File omfattar metoder som visar en systemdialogruta där användaren kan välja en fil och tilldela den till objektet:
Dessa metoder är asynkrona. Metoden browseForOpen() och browseForSave() skickar den valda händelsen när användaren väljer en fil (eller en målsökväg när det gäller browseForSave()). Med metoderna browseForOpen() och browseForSave() pekar mål-File-objektet mot de valda filerna. Metoden browseForOpenMultiple() skickar en selectMultiple-händelse när användaren väljer filer. Händelsen selectMultiple är av typen FileListEvent, som har en files-egenskap som är en array med File-objekt (som pekar mot de valda filerna). Följande kod visar dialogrutan ”Öppna” för användaren där användaren kan välja en fil: var fileToOpen:File = File.documentsDirectory; selectTextFile(fileToOpen); function selectTextFile(root:File):void { var txtFilter:FileFilter = new FileFilter("Text", "*.as;*.css;*.html;*.txt;*.xml"); root.browseForOpen("Open", [txtFilter]); root.addEventListener(Event.SELECT, fileSelected); } function fileSelected(event:Event):void { trace(fileToOpen.nativePath); } Om programmet har en annan webbläsardialogruta öppen när du anropar en bläddringsmetod, returneras ett Error-undantag. Ändra File-sökvägarDu kan också ändra sökvägen för ett befintligt File-objekt genom att anropa metoden resolvePath() eller ändra egenskapen nativePath eller url för objektet, som i följande exempel (i Windows): var file1:File = File.documentsDirectory; file1 = file1.resolvePath("AIR Test"); trace(file1.nativePath); // C:\Documents and Settings\userName\My Documents\AIR Test var file2:File = File.documentsDirectory; file2 = file2.resolvePath(".."); trace(file2.nativePath); // C:\Documents and Settings\userName var file3:File = File.documentsDirectory; file3.nativePath += "/subdirectory"; trace(file3.nativePath); // C:\Documents and Settings\userName\My Documents\subdirectory var file4:File = new File(); file4.url = "file:///c:/AIR Test/test.txt"; trace(file4.nativePath); // C:\AIR Test\test.txt När du använder egenskapen nativePath använder du snedstrecket (/) som katalogavgränsare. På Windows kan du även använda omvänt snedstreck (\), men du bör inte göra det eftersom det kan innebära att koden inte fungerar på alla plattformar. URL-scheman som stöds i AIRI AIR kan du använda följande URL-scheman när du definierar egenskapen url för ett File-objekt:
Hitta den relativa sökvägen mellan två filerMed metoden getRelativePath() kan du söka efter den relativa sökvägen mellan två filer: var file1:File = File.documentsDirectory.resolvePath("AIR Test"); var file2:File = File.documentsDirectory file2 = file2.resolvePath("AIR Test/bob/test.txt"); trace(file1.getRelativePath(file2)); // bob/test.txt Den andra parametern för metoden getRelativePath(), parametern useDotDot, gör att syntaxen .. kan returneras i resultat, vilket anger överordnade kataloger: var file1:File = File.documentsDirectory; file1 = file1.resolvePath("AIR Test"); var file2:File = File.documentsDirectory; file2 = file2.resolvePath("AIR Test/bob/test.txt"); var file3:File = File.documentsDirectory; file3 = file3.resolvePath("AIR Test/susan/test.txt"); trace(file2.getRelativePath(file1, true)); // ../.. trace(file3.getRelativePath(file2, true)); // ../../bob/test.txt Skaffa kanoniska versioner av filnamnFil- och sökvägsnamn är inte skiftlägeskänsliga i Windows och Mac OS. Nedan pekar två File-objekt mot samma fil: File.documentsDirectory.resolvePath("test.txt"); File.documentsDirectory.resolvePath("TeSt.TxT"); Dokument- och katalognamnen har emellertid samma skiftläge. Nedan förutsätts det att det finns en mapp med namnet AIR Test i dokumentkatalogen: var file:File = File.documentsDirectory.resolvePath("AIR test"); trace(file.nativePath); // ... AIR test file.canonicalize(); trace(file.nativePath); // ... AIR Test Metoden canonicalize() konverterar nativePath-objektet så att rätt skiftläge används för fil- eller katalognamnet. Om användningen av gemener och versaler är det enda som skiljer olika filer åt i ett system som är skiftlägeskänsligt (t.ex. Linux) justerar canonicalize()-metoden sökvägen så att den matchar den första fil som hittas (i den ordning som fastställs av filsystemet). Du kan också använda metoden canonicalize() om du vill konvertera korta filnamn (”8.3”-namn) till långa filnamn i Windows, som i följande exempel: var path:File = new File(); path.nativePath = "C:\\AIR~1"; path.canonicalize(); trace(path.nativePath); // C:\AIR Test Arbeta med paket och symboliska länkarOlika operativsystem stöder paketfiler och filer med symboliska länkar: Paket – I Mac OS kan kataloger definieras som paket och visas som en fil i Finder i Mac OS i stället för som en katalog. Symboliska länkar – Symboliska länkar stöds i Mac OS, Linux och Windows Vista. Med hjälp av symboliska länkar kan en fil peka på en annan fil eller katalog på disken. Även om de påminner om varandra är symboliska länkar och alias inte samma sak. Ett alias rapporteras alltid som en fil (i stället för som en katalog), och om du läser eller skriver till aliaset eller genvägen påverkar detta inte den ursprungliga fil eller katalog som dessa pekar på. En symbolisk länk fungerar däremot precis som den fil eller katalog den pekar på. Den kan rapporteras som en fil eller katalog, och om du läser eller skriver till en symbolisk länk påverkar detta den fil eller katalog som länken pekar på, inte den symboliska länken. I Windows är dessutom egenskapen isSymbolicLink för ett File-objekt som refererar till en knutpunkt (används i NTFS-filsystemet) angiven som true . Klassen File omfattar egenskaperna isPackage och isSymbolicLink som kontrollerar om ett File-objekt refererar till ett paket eller en symbolisk länk. Följande kod itererar genom användarens skrivbordskatalog, och visar underkataloger som inte är paket: var desktopNodes:Array = File.desktopDirectory.getDirectoryListing(); for (var i:uint = 0; i < desktopNodes.length; i++) { if (desktopNodes[i].isDirectory && !!desktopNodes[i].isPackage) { trace(desktopNodes[i].name); } } Följande kod itererar genom användarens skrivbordskatalog, och visar filer och kataloger som inte är symboliska länkar: var desktopNodes:Array = File.desktopDirectory.getDirectoryListing(); for (var i:uint = 0; i < desktopNodes.length; i++) { if (!desktopNodes[i].isSymbolicLink) { trace(desktopNodes[i].name); } } Metoden canonicalize() ändrar sökvägen för en symbolisk länk till att peka mot filen eller katalogen som länken refererar till. Följande kod itererar genom användarens skrivbordskatalog, och rapporterar sökvägarna som refereras av filer som är symboliska länkar: var desktopNodes:Array = File.desktopDirectory.getDirectoryListing(); for (var i:uint = 0; i < desktopNodes.length; i++) { if (desktopNodes[i].isSymbolicLink) { var linkNode:File = desktopNodes[i] as File; linkNode.canonicalize(); trace(linkNode.nativePath); } } Ta reda på ledigt utrymme på en volymEgenskapen spaceAvailable för ett File-objekt anger det lediga utrymmet vid File-platsen, i byte. Följande kod kontrollerar det lediga utrymmet i programlagringskatalogen: trace(File.applicationStorageDirectory.spaceAvailable); Om filobjektet refererar till en katalog, visar egenskapen spaceAvailable utrymmet i den katalog som filen kan använda. Om filobjektet refererar till en fil, visar egenskapen spaceAvailable utrymmet som filen kan växa till. Om filplatsen inte finns, är egenskapen spaceAvailable inställd på 0. Om filobjektet refererar till en symbolisk länk, ställs egenskapen spaceAvailable in på det lediga utrymme som den symboliska länken pekar ut. Vanligtvis är det tillgängliga utrymmet för en katalog eller fil samma som det tillgängliga utrymmet i volymen som innehåller katalogen eller filen. Kvoter och kataloggränser räknas dock med i tillgängligt utrymme. Att lägga till en fil eller en katalog i en volym kräver generellt mer utrymme än den befintliga storleken på filen eller på innehållet i katalogen. Operativsystemet kan till exempel kräva mer utrymme för att lagra indexinformation. Eller också kan disksektorerna kräva mer utrymme. Tillgängligt utrymme ändras dynamiskt. Du kan alltså inte förvänta dig att tilldelas hela det rapporterade utrymmet för fillagring. Information om hur du skriver till filsystemet finns i Läsa och skriva filer. Metoden StorageVolumeInfo.getStorageVolumes() ger mer detaljerad information om monterade lagringsvolymer (se Arbeta med lagringsvolymer). Öppna filer med standardsystemprogrammetI AIR 2 kan du öppna en fil med hjälp av det program som registrerats i operativsystemet för att öppna filen. Ett AIR-program kan till exempel öppna en DOC-fil med det program som registrerats för att öppna den. Använd metoden openWithDefaultApplication() för ett File-objekt för att öppna filen. Med följande kod öppnas till exempel en fil med namnet test.doc på användarens skrivbord med hjälp av standardprogrammet för DOC-filer: var file:File = File.deskopDirectory; file = file.resolvePath("test.doc"); file.openWithDefaultApplication(); Obs! I Linux avgörs standardprogrammet för en fil av filens MIME-typ, inte genom filtillägget.
Med följande kod kan användaren navigera till en mp3-fil och öppna den i standardprogrammet för att spela upp mp3-filer: var file:File = File.documentsDirectory; var mp3Filter:FileFilter = new FileFilter("MP3 Files", "*.mp3"); file.browseForOpen("Open", [mp3Filter]); file.addEventListener(Event.SELECT, fileSelected); function fileSelected(e:Event):void { file.openWithDefaultApplication(); } Du kan inte använda metoden openWithDefaultApplication() med filer som finns i programkatalogen. Med AIR förhindras du att använda metoden openWithDefaultApplication() för att öppna vissa filer. I Windows förhindras du av AIR att öppna filer med vissa filtyper, till exempel EXE eller BAT. I Mac OS och Linux förhindrar AIR att du öppnar filer i vissa program. (Det gäller bland annat terminalen och AppletLauncher i Mac OS och csh, bash eller ruby i Linux.) Om du försöker öppna någon av dessa filer med metoden openWithDefaultApplication() resulterar det i ett undantag. En komplett lista över förhindrade filtyper finns under språkreferensposten för metoden File.openWithDefaultApplication(). Obs! Denna begränsning gäller inte för AIR-program som installerats med ett internt installationsprogram (ett utökat skrivbordsprogram), se Paketera ett AIR-program i ett internt installationsprogram.
|
|