Adobe AIR和不同操作系统的文件系统

6

这里有一个与Adobe Air相关的问题,但首先我来介绍一下我被分配的项目的背景。它是一个能够从 USB 密钥读取资产并且必须在 WIN 和 MacOS 上运行的 AIR 应用程序。问题是如何在 MacOS 上将资产加载到应用程序中!听起来很简单,而且在 Windows 上无缝运作。

这是我正在尝试做的代码片段:

            var loader:Loader = new Loader(); 
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, ok);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

            var p:String;

            if (os == "mac")
            {
                p = "/Volumes/" + keyVolume.rootDirectory.name + File.separator + "0a0ff0ff-f7ae-4b9c-9637-843b1d6c80e8.jpg";
            }
            else
            {
                p = keyVolume.rootDirectory.name + File.separator + "0a0ff0ff-f7ae-4b9c-9637-843b1d6c80e8.jpg";
            }

            var temp:File = new File(p);
            Debugger.Display.text += "\nAttempting to load: " + p;
            Debugger.Display.text += "\nDoes it exist? " + temp.exists;
            loader.load(new URLRequest(p));

之前的代码已经成功设置了变量OS和keyVolume。同时,我也定义了ok()和ioError()的事件监听器回调函数。

在Windows上运行时,它会打印出:

尝试加载:G:\0a0ff0ff-f7ae-4b9c-9637-843b1d6c80e8.jpg
是否存在:true

...然后成功加载资产。

在MacOS上,它会打印出:

尝试加载:/Volumes/AC/0a0ff0ff-f7ae-4b9c-9637-843b1d6c80e8.jpg
是否存在:true

...然后每次都失败并显示IOError。

有人能看到我遗漏了什么吗?我是否有某种权限错误或其他问题(文件具有“读/写”权限)。U盘格式为MS-DOS FAT32,这可能是一个问题吗?

编辑

我在MacOS上将新的USB键格式化为FAT16,并将文件放入其中,但没有成功。问题依然存在。

编辑

我现在只是尝试从/users/-USERNAME-/Desktop加载资产,仍然收到相同的错误,因此看起来这不仅是对USB存储设备的权限问题,它比那更普遍。

编辑

问题解决了!我最终正确地表达了我的谷歌搜索,它揭示了答案

这些更改将解决问题:

            var loader:Loader = new Loader(); 
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, ok);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

            var p:String = keyVolume.rootDirectory.nativePath + ((os == "mac") ? File.separator : "") + "0a0ff0ff-f7ae-4b9c-9637-843b1d6c80e8.jpg";
            var temp:File = new File(p);
            Debugger.Display.text += "\nAttempting to load: " + temp.url;
            Debugger.Display.text += "\nDoes it exist? " + temp.exists;
            loader.load(new URLRequest(temp.url));

我还稍微完善了涉及操作系统检测的逻辑语句。

希望有人会觉得这个有用!


FAT32 应该完全没问题。你有 IOError 的更多信息吗? - Ben
路径中的“AC”有什么区别? - Ben
在MacOS中,“AC”是驱动器名称。它不影响Windows路径,因为Windows使用驱动器字母。 - nokturnal
1
使用File类的url属性而不是nativePath属性解决了我在Mac上遇到的问题!感谢您发布您发现的内容! - Jordan
Samuel,谢谢你的建议。Mudasir已经试图劫持答案了 :) - nokturnal
1个回答

1
问题解决了!我终于正确地用谷歌搜索了一下,找到了答案
以下更改将解决问题:
            var loader:Loader = new Loader(); 
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, ok);
            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

            var p:String = keyVolume.rootDirectory.nativePath + ((os == "mac") ? File.separator : "") + "0a0ff0ff-f7ae-4b9c-9637-843b1d6c80e8.jpg";
            var temp:File = new File(p);
            Debugger.Display.text += "\nAttempting to load: " + temp.url;
            Debugger.Display.text += "\nDoes it exist? " + temp.exists;
            loader.load(new URLRequest(temp.url));

我还对涉及操作系统检测的逻辑语句进行了一些优化。

希望有人会觉得这很有用!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接