FTP 명령 실행 (ftp.cmd)
선언
result, err = ftp.cmd(URL, cmd [, connectTimeoutSec ])
매개변수
- URL
문자열형. 계정과 비밀번호를 포함한 원격 FTP URL입니다. 디렉터리 작업에는/로 끝나는 디렉터리 URL을 사용해야 합니다. - cmd
문자열형.MKD test와 같은 FTP 프로토콜 명령 하나를 지정합니다. 명령 테이블 전달은 지원하지 않습니다. - connectTimeoutSec
실수형 선택 매개변수. 연결 제한 시간이며 단위는 초, 기본값은 10입니다. 전체 요청의 총 소요 시간은 제한하지 않습니다.
반환값
- result
문자열형 또는 nil. 요청에 성공하면 수신한 데이터를 반환하며 빈 문자열일 수도 있습니다. 디렉터리 URL을 사용하면 일반적으로 디렉터리 목록이며, FTP 명령의 상태 코드나 제어 연결의 응답이 아닙니다. 실패하면 nil을 반환합니다. - err
문자열형 또는 nil. 실패하면 오류 원인을 설명하는 문자열을 반환합니다. 성공하면 두 번째 값을 반환하지 않으므로 값을 받는 변수는 nil입니다.
설명
FTP 서버에 명령을 보내 디렉터리 생성 등의 작업을 수행합니다. 작업 대상은 서버의 파일이나 디렉터리입니다.
명령은 URL에 지정된 디렉터리로 이동하기 전에 실행됩니다. 상대 경로는 로그인 후의 기본 디렉터리를 기준으로 합니다. 예를 들어 MKD uploads/test는 기본 디렉터리 아래의 uploads 안에 test를 만듭니다. URL의 경로가 명령의 작업 디렉터리를 바꾼다고 가정하지 마세요. 명령의 경로는 URL 퍼센트 디코딩 없이 그대로 전송됩니다.
MKD는 일반적으로 한 단계의 디렉터리만 생성하므로 상위 디렉터리가 이미 존재해야 합니다. 디렉터리가 이미 존재하거나 계정에 권한이 없거나 서버가 해당 명령을 지원하지 않으면 실패할 수 있습니다. 여러 단계의 디렉터리를 만들려면 상위 디렉터리부터 하위 디렉터리 순서로 각각 호출해야 합니다.
현재 구현에서는 명령 문자열에 대문자 LIST 또는 NLST가 포함되면 해당 명령 전송을 건너뛰고 URL의 기본 요청만 실행합니다. 해당 문자열이 디렉터리 이름에 포함된 경우도 동일합니다. 따라서 NLST를 지정해도 파일 이름만 나열하는 목록으로 전환되지 않으며 LIST -a의 인수도 적용되지 않습니다.
명령 실행 후에도 URL에 해당하는 데이터를 요청하며, 디렉터리 URL을 사용하면 디렉터리 목록도 가져옵니다. 이후 목록 조회나 데이터 연결이 실패하면 디렉터리가 이미 생성되었더라도 함수는 nil과 오류 메시지를 반환합니다.
이 함수는 실행권을 양보할 수 있으며 반환되기 전에 다른 스레드가 실행 기회를 얻을 수 있습니다.
간단한 예제
계정과 비밀번호는 URL에 작성합니다. URL 형식은 다음과 같습니다(대괄호 안은 선택 사항입니다):
ftp://[user:password@]host[:port]/path
계정 또는 비밀번호에
@,:,/문자가 포함되면 각각%40,%3A,%2F로 이스케이프할 수 있습니다. URL에서 허용되지 않는 다른 문자는 URL 퍼센트 인코딩을 사용할 수 있습니다. 예를 들어 계정이havonz, 비밀번호가11@@22일 때 로그인 후의 기본 디렉터리에 test를 만듭니다:
local result, err = ftp.cmd("ftp://havonz:11%40%[email protected]/", "MKD test", 10)
if result == nil then
sys.alert("생성 실패: " .. tostring(err))
else
sys.alert("생성 성공")
end
복잡한 예제
demo와 demo/logs를 순서대로 만듭니다. 두 디렉터리 모두 아직 존재하지 않아야 합니다. 어느 단계에서든 실패하면 중지하며, 이전에 생성한 디렉터리를 자동으로 삭제하지 않습니다.
local url = "ftp://havonz:11%40%[email protected]/"
for _, path in ipairs({ "demo", "demo/logs" }) do
local result, err = ftp.cmd(url, "MKD " .. path, 10)
if result == nil then
sys.alert("생성 실패 " .. path .. ": " .. tostring(err))
return
end
end
sys.alert("디렉터리 생성 완료")
참고: 위 코드에서는 다른 장의 함수인 sys.alert를 사용합니다.