2016-01-04 1 views
0

Я использую ресурсы .mp3 и .wav в своем проекте Corona. Когда я открываю свой ресурсный каталог Sandbox Project, все, что я вижу, это .png-файлы, которые используются для значков приложений и т. Д., А не аудиофайлы (.mp3s и .wavs).Corona SDK - список (аудио) Файлы активов проекта (которые, как я думал, будут в системе. ResourceDirectory)

Однако у меня есть удобная функция, чтобы проверить наличие файла в каталоге:

function doesFileExist(fname, path) 

    local results = false 

    local filePath = system.pathForFile(fname, path) 

    -- filePath will be nil if file doesn't exist and the path is ResourceDirectory 
    -- 
    if filePath then 
     filePath = io.open(filePath, "r") 
    end 

    if filePath then 
     print("File found -> " .. fname) 
     -- Clean up our file handles 
     filePath:close() 
     results = true 
    else 
     print("File does not exist -> " .. fname) 
    end 

    print() 

    return results 
end 

Когда я использую

doesFileExist('filename.mp3', system.ResourceDirectory) 

Я получил true вернулся, который подтверждает у меня есть там файл , Кроме того, я могу воспроизводить музыку и т. Д.

У меня есть довольно много таких аудиофайлов, которые я хотел бы скопировать в систему. ДокументDocumentsDirectory с использованием цикла for перечисляет каждый аудиофайл и копирует его в DocumentsDirectory.

Я бы предпочел не кодировать этот MANUALLY для каждого файла.

Есть ли способ перечислить аудио-активы внутри проецируемого в Corona ???

Я бы подумал, что эти файлы активов будут находиться в system.ResourceDirectory, но если я открою песочницу, я их не увижу, и если я перечислил ее с помощью этого кода, аудиофайлы не будут включены в список:

local lfs = require "lfs" 

local doc_path = system.pathForFile("", system.ResourceDirectory) 

print('doc_path', doc_path) 

for file in lfs.dir(doc_path) do 
    -- file is the current file or directory name 
    print("RESOURCE DIRECTORY - Found file: " .. file) 


    print(GetFileExtension(file)) 
    local tempext = GetFileExtension(file) 

    if(exists(loadTypes[ "sound" ].extensions , tempext) or exists(loadTypes[ "stream" ].extensions , tempext)) then 
     print('FOUND ONE TO ADD') 

    end 
    -- if(file ~= '.' and file ~= '..' and file ~= dataFileName) then 
    -- if(file ~= '.' and file ~= '..') then 
    -- table.insert(audioFiles, file) 
    -- end 

end 

Поэтому, если я использую функцию doesFileExist выше, звуковые файлы «нашли» и «видимый», но если я использую приведенный выше код, который проверяет файлы внутри system.ResourceDirectory, то звук файлы НЕ НАЙДЕНЫ .... и если я открою песочницу проекта, я также не вижу там аудиофайлы ....

Как мне перечислить все t он активов (аудио активов в моем случае) Я включил в свой проект короны ???

Спасибо ...

ответ

1

Там, кажется, некоторая путаница в вашем вопросе, поэтому позвольте мне прояснить некоторые вещи.

system.ResourceDirectory = Где вы проецировать файлы (т.е. main.lua и т.д.) system.DocumentsDirectory = Песочница (т.е. "Показать Песочница Project")

system.Documentsdirectory:

В Corona Simulator, это будет в изолированной папке на для каждого приложения. Вы можете просмотреть каталоги/файлы через Файл → Показать Песочницу проекта.

https://docs.coronalabs.com/api/library/system/DocumentsDirectory.html#system.documentsdirectory

Теперь, с тем, что мы должны найти MP3-файлов. Я бы, вероятно, создал папку (%MY_PROJECT%/assets/audio/) со всеми моими MP3 и скопировал их в систему.Documentsdirectory, если он не существует, однако, если вы по-прежнему настаиваете на поиск MP3-файл под основной папкой здесь есть некоторый код, который работает:

local lfs = require("lfs") 
local path = system.pathForFile(nil, system.ResourceDirectory) 
lfs.chdir(path) 

-- Load in each file found 
for file in lfs.dir(path) do 
    local last_three = string.sub(file, #file - 2, #file) 
    if last_three == "mp3" then 
     -- LOGIC -- 
      copyFile(file, system.ResourceDirectory, file, system.DocumentsDirectory, false) 

    end 
end 

Реализовать CopyFile и убедитесь, что он имеет доступ к doesFileExist. Если параметр overwrite установлен в false файл не будет переписан, поэтому нет никакой необходимости иметь какой-либо «Существует ли файл» логики в фрагменте выше, как это реализовано в copyFile:

function copyFile(srcName, srcPath, dstName, dstPath, overwrite) 

    local results = false 

    local fileExists = doesFileExist(srcName, srcPath) 
    if (fileExists == false) then 
     return nil -- nil = Source file not found 
    end 

    -- Check to see if destination file already exists 
    if not (overwrite) then 
     if (fileLib.doesFileExist(dstName, dstPath)) then 
      return 1 -- 1 = File already exists (don't overwrite) 
     end 
    end 

    -- Copy the source file to the destination file 
    local rFilePath = system.pathForFile(srcName, srcPath) 
    local wFilePath = system.pathForFile(dstName, dstPath) 

    local rfh = io.open(rFilePath, "rb") 
    local wfh, errorString = io.open(wFilePath, "wb") 

    if not (wfh) then 
     -- Error occurred; output the cause 
     print("File error: " .. errorString) 
     return false 
    else 
     -- Read the file and write to the destination directory 
     local data = rfh:read("*a") 
     if not (data) then 
      print("Read error!") 
      return false 
     else 
      if not (wfh:write(data)) then 
       print("Write error!") 
       return false 
      end 
     end 
    end 

    results = 2 -- 2 = File copied successfully! 

    -- Close file handles 
    rfh:close() 
    wfh:close() 

    return results 
end 
+0

Привет ... ваш предложение папки с ресурсами хорошо ... Я пытаюсь включить это ... Однако, используя ваш цикл, если я делаю system.ResourceDirectory .. '/ assets', он делает что-то вроде «попытки коронки конкатенации значения userdata» и если я делаю tostring (system.ResourceDirectory), я получаю ... 'system.pathForFile: недопустимый базовый каталог (ожидаемая константа получила строку)' ... как вы изменяете код выше, чтобы использовать «активы» или «активы/аудио "в приложении ... спасибо ... – preston

+0

Привет ... ok ... нашел решение вопроса, который я разместил в комментарии abov e .... просто добавьте это: path = path .. "/ assets" перед lfs.chdir (путь) .... спасибо за обмен кодом – preston

+1

Рад слышать, как это работает! Вы также можете добавить папку при вызове copyFile следующим образом: 'copyFile (« assets/».. file, system.ResourceDirectory, file, system.DocumentsDirectory, false)' или установить путь непосредственно, как этот 'local path = system.pathForFile («assets /», system.ResourceDirectory). – Jefecito