Verificare se esiste un file con Lua

Come posso verificare se esiste un file che utilizza Lua?

  • sicuramente un duplicato?
  • come in stackoverflow.com/questions/1340230/… ?
  • Credo più come lua.org/pil/21.2.html
  • che è anche vicino a una vera risposta. Ho solo fatto un rapido controllo solo così
  • Ciao, Thx per la rapida risposta. Sto facendo: assert(io.input(nome del file), “Errore nell’apertura del file”), Ma quando mi danno un manichino di nome di file, non ottengo il messaggio di errore : “Errore nell’apertura del file”. Il messaggio che ricevo è: “bad argomento #1 per ‘input’ (/pfrm2.0/share/lua/5.1/db/falso.dbdl: No such file or directory)” ogni pensiero ?
  • Yoni, capisco che è appena entrato COSÌ. Benvenuto. Alcune cose da ricordare. 1) non rispondere alla tua domanda con un’altra domanda. 2) Prova a cercare in giro (Google è tuo amico) per ulteriori info e solo se si è completamente bloccato chiedere qui. Credo che questo farà di te una migliore sviluppatore.
  • La ragione si ottiene “bad argomento#1 per ‘input'” ingresso è in Lua solo prende un argomento e si passa a 2. Inoltre non devi far valere io.non aprire ingresso.
  • Ciao Liutauras, io prenderò più noti per la prossima volta, ci scusiamo per questo.
  • Inoltre, ho cambiare io.aprire e ora funziona. Grazie
  • Nessun problema Yoni. Grazie per l’ordinamento tua domanda. Sembra proprio bello, ora. Non è perché ci piace COSÌ. Perché è bello.

InformationsquelleAutor Yoni | 2011-02-14



13 Replies
  1. 102

    Provare

    function file_exists(name)
       local f=io.open(name,"r")
       if f~=nil then io.close(f) return true else return false end
    end

    ma si noti che questo codice test solo se il file può essere aperto per la lettura.

    • nessuna fonte migliore per una risposta che l’uomo stesso.
  2. 7

    Normale Lua, il meglio che puoi fare è vedere se un file può essere aperto in lettura, come per LHF. Questo è quasi sempre sufficiente. Ma se volete saperne di più, caricare il Lua libreria POSIX e controllare se posix.stat(percorso) ritorna nonnil.

    • LuaFileSystem funziona su tutti i Windows. Utilizzare lfs.attributes(path,'mode')
  3. 5

    Cito me stesso da qui

    Io uso questi (ma in realtà ho di controllo per l’errore):

    require("lfs")
    -- no function checks for errors.
    -- you should check for them
    
    function isFile(name)
        if type(name)~="string" then return false end
        if not isDir(name) then
            return os.rename(name,name) and true or false
            -- note that the short evaluation is to
            -- return false instead of a possible nil
        end
        return false
    end
    
    function isFileOrDir(name)
        if type(name)~="string" then return false end
        return os.rename(name, name) and true or false
    end
    
    function isDir(name)
        if type(name)~="string" then return false end
        local cd = lfs.currentdir()
        local is = lfs.chdir(name) and true or false
        lfs.chdir(cd)
        return is
    end

    os.rinominare(nome1, nome2) rinominare nome1 per nome2. Utilizzare lo stesso nome e lo stesso dovrebbe cambiare nulla (tranne che c’è un badass di errore). Se tutto ha funzionato bene restituisce true, altrimenti restituisce nil e il errormessage. Se non si desidera utilizzare lfs si può distinguere tra file e directory senza il tentativo di aprire il file (che è un po ‘ lento, ma ok).

    Senza LuaFileSystem

    -- no require("lfs")
    
    function exists(name)
        if type(name)~="string" then return false end
        return os.rename(name,name) and true or false
    end
    
    function isFile(name)
        if type(name)~="string" then return false end
        if not exists(name) then return false end
        local f = io.open(name)
        if f then
            f:close()
            return true
        end
        return false
    end
    
    function isDir(name)
        return (exists(name) and not isFile(name))
    end

    Sembra più breve, ma dura più a lungo…
    Anche aprire un file è un rischioso

    Divertirsi codificazione!

    • Come sono errori da os.rinominare trattati in materia di rinominare i file in sola lettura?
    • Quali sono i rischi semplicemente l’apertura di un file da lua?
    • Se si tenta di aprire un file bloccato e leggere, può causare un errore (si vuole ancora sapere se la sua un file o non). Lo stesso vale per le directory (se diectory blocco è supportato su host).
    • Che cosa vuoi dire? Con ‘badass errore’ non volevo dire qualcosa si potrebbe risolvere con il codice. Tuttavia, per quanto ne so è possibile utilizzare pcall per catturarli. La movimentazione può essere complicato e disinformative messaggi di errore potrebbe essere restituito.
  4. 5

    Se si utilizza Premake e LUA versione 5.3.4:

    if os.isfile(path) then
        ...
    end
    • questo non è ufficiale di una funzione di funzione di premake
    • AH. Il mio errore. premake è tutto che io uso lua per. 🙁
    • Nessun problema di accoppiamento
  5. 3

    Per completezza di informazione: Si può anche solo tentare la fortuna con path.exists(filename). Io non sono sicuro che Lua distribuzioni in realtà hanno questo path spazio dei nomi (aggiornamento: Penlight), ma almeno è incluso nel Torcia:

    $ th
    
      ______             __   |  Torch7
     /_  __/__  ________/ /   |  Scientific computing for Lua.
      / / / _ \/ __/ __/ _ \  |  Type ? for help
     /_/  \___/_/  \__/_//_/  |  https://github.com/torch
                              |  http://torch.ch
    
    th> path.exists(".gitignore")
    .gitignore  
    
    th> path.exists("non-existing")
    false   

    debug.getinfo(path.exists) mi dice che la sua fonte è in torch/install/share/lua/5.1/pl/path.lua e viene implementato come segue:

    --- does a path exist?.
    -- @string P A file path
    -- @return the file path if it exists, nil otherwise
    function path.exists(P)
        assert_string(1,P)
        return attrib(P,'mode') ~= nil and P
    end
  6. 3

    Se si è disposti a utilizzare lfs, è possibile utilizzare lfs.attributes. Si tornerà nil in caso di errore:

    require "lfs"
    
    if lfs.attributes("non-existing-file") then
        print("File exists")
    else
        print("Could not get attributes")
    end

    Anche se può tornare nil per altri errori di diverso da un file non esistente, se non restituisce nil, il file esiste certamente.

  7. 2

    Una risposta che è solo per windows controlla i file e le cartelle, e non richiede ulteriori pacchetti. Restituisce true o false.

    io.popen("if exist "..PathToFileOrFolder.." (echo 1)"):read'*l'=='1'

    io.popen(…):read’*l’ – l’esecuzione di un comando nel prompt dei comandi e legge il risultato dal CMD stdout

    se esiste – comando CMD per verificare se un oggetto esiste

    (echo 1) – stampe da 1 a stdout del prompt dei comandi

  8. 1

    È inoltre possibile utilizzare i ‘percorsi’ pacchetto. Qui‘il link per il pacchetto

    Quindi in Lua fare:

    require 'paths'
    
    if paths.filep('your_desired_file_path') then
        print 'it exists'
    else
        print 'it does not exist'
    end
  9. 0

    Non necessariamente la più ideale in quanto non so il vostro scopo specifico per questo o se si desidera una implementazione in mente, ma si può semplicemente aprire il file per verificare la propria esistenza.

    local function file_exists(filename)
        local file = io.open(filename, "r")
        if (file) then
            -- Obviously close the file if it did successfully open.
            file:close()
            return true
        end
        return false
    end

    io.open restituisce nil se non riesce ad aprire il file. Come nota a margine, questo è il motivo per cui viene spesso utilizzato con assert di produrre un utile messaggio di errore se non è in grado di aprire il file. Per esempio:

    local file = assert(io.open("hello.txt"))

    Se il file hello.txt non esiste, si dovrebbe ottenere un messaggio di errore simile a stdin:1: hello.txt: No such file or directory.

  10. 0

    Lua 5.1:

    function file_exists(name)
       local f = io.open(name, "r")
       return f ~= nil and io.close(f)
    end
  11. 0

    Per la soluzione della raccolta, è possibile utilizzare paths o path.

    Dal documento ufficiale di paths:

    percorsi.filep(percorso)

    Restituire un valore booleano che indica se il percorso si riferisce a un file esistente.

    percorsi.dirp(percorso)

    Restituire un valore booleano che indica se il percorso fa riferimento a una directory esistente.

    Anche se i nomi sono un po ‘ strano, si può certamente utilizzare paths.filep() per verificare se esiste un tracciato e si tratta di un file. Utilizzare paths.dirp() per verificare se esiste ed è una directory. Molto conveniente.

    Se si preferisce path piuttosto che paths, è possibile utilizzare path.exists() con assert() per verificare l’esistenza di un percorso, ottenendo il suo valore al tempo stesso. Utile quando si stanno costruendo percorso da pezzi.

    prefix = 'some dir'
    
    filename = assert(path.exist(path.join(prefix, 'data.csv')), 'data.csv does not exist!')

    Se si desidera controllare il risultato booleano, utilizzare path.isdir() e path.isfile(). I loro scopi sono ben comprese dai loro nomi.

  12. 0

    Che ne dite di fare qualcosa di simile a questo?

    function exist(file)
      local isExist = io.popen(
        '[[ -e '.. tostring(file) ..' ]] && { echo "true"; }')
      local isIt = isExist:read("*a")
      isExist:close()
      isIt = string.gsub(isIt, '^%s*(.-)%s*$', '%1')
      if isIt == "true" then
        return true
      end
    end
    
    if exist("myfile") then
      print("hi, file exists")
    else
      print("bye, file does not exist")
    end
  13. -6
    IsFile = function(path)
    print(io.open(path or '','r')~=nil and 'File exists' or 'No file exists on this path: '..(path=='' and 'empty path entered!' or (path or 'arg "path" wasn\'t define to function call!')))
    end
    
    IsFile()
    IsFile('')
    IsFIle('C:/Users/testuser/testfile.txt')

    Sembra buona per testare la tua strada. 🙂

    • Il codice delle perdite di file handes.

Lascia un commento