2010-03-14 32 views
5

Yerleşik bir ftp sunucusu yazıyorum ve giriş biçimini doğru şekilde alamıyorum. Sunucu tamamen çalışır, sadece FileZilla gibi programlar listeleme formatını yorumlayamaz.FTP Liste biçimi

-rwxr--r-- 1 owner group 640 1970 01 01 test 
-rwxr--r-- 1 owner group 13440 1970 01 01 test.html 
-rwxr--r-- 1 owner group 512 1970 01 01 test2.txt 

temelde:

permissions[tab]number?[tab]owner[tab]group[tab]filesize[tab]date[tab]filename 

yanlış yapıyorum Aşağıda örnek bir girişidir?

sayesinde Yvan

+0

FTP LİSTESİ çıkışı için standart bir format yoktur. Farklı sunucular farklı formatlar kullanır. Hangisini taklit etmeye çalışıyorsun? – skaffman

+0

A UNIX - iPhone için C# içinde gömülü bir sunucudur. Ancak sorunu buldum: Dizin listelemelerim düzgün şekilde hizalanmadı ve dosya listelerim vardı. Şimdi FileZilla'da doğru bir şekilde açılıyor. Teşekkürler! – friedkiwi

cevap

7

Gibi Diğerleri zaten bahsetti, sekmeler yerine boşluk kullanmanız gerekir.

sprintf(line, "%s 1 %-10s %-10s %10lu Jan 1 1980 %s\r\n", 
    permstr, username, username, 
    length, 
    filename); 

permstr"-rw-rw-rw-" gibi bir dizeye ayarlanır: İşte çalışmalıdır başka gömülü FTP sunucusundan bir sprintf bu.

tarih biçimleri gelince, bu iki tarih 6 aydan daha eski olması durumunda kullanılan üst, çalışması gerekir:

if (dfmt) 
    sprintf(buf, "%3.3s %2d %04d", month_name, month_num, year); 
else 
    sprintf(buf, "%3.3s %2d %02d:%02d", month_name, month_num, hour, minute); 
1

tipik ftp sunucusu listeleme için ls -l için Kabuk olacaktır. Bu çıktının sekme karakterlerini değil, çıktıyı hizalayan boşluk karakterleri içerdiğini düşünüyorum.

FileZilla'nın neden dizin listelemenizi ayrıştırmayacağından emin olmanın tek yolu, FileZilla için açık kaynak elde etmek ve hata ayıklayıcıda olup bitenleri izlemektir. Ama bence, ls çıktısını beyaz boşluk dahil olmak üzere mümkün olduğunca tam olarak çoğaltarak ilerleme kaydedebilirsiniz. Eğer programlama dilini belirtmedi yana

7

, ben

 
permissions[tab]number?[tab]owner[tab]group[tab]filesize[tab]date[tab]filename 
       ^^^^^^^          ^^^^ 
      no of inodes      Dates can vary, it can be year on its own or Month, Day 

Gösteriden için aşağıdaki regexp'in en, bu uyarlanabilir C# dahil etmeye karar verdik .... ben bu benim 2cents vermek düşündü ... bunun tamamen boşluk, hiçbir sekme yok,

 
      private Regex ftpUnixListInfo = new Regex(
       @"(?" + 
       @"(?[-|d|r|w|x]+)\s+" + 
       @"(?\d+)\s*" + 
       @"(?\w+)?\s+" + 
       @"(?\w+)\s*" + 
       @"(?\d+)\s+" + 
       @"(?\w+)\s+" + 
       @"(?\d{1,2})\s+" + 
       @"(?:(?\d{2}\:\d{2})|(?\d{4}))\s+" + 
       @"(?.+))", 
       RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace 
       | RegexOptions.Compiled); 

      // Regex for Microsoft FTP Server 
      private Regex ftpMsListInfo = new Regex(
       @"(?" + 
       @"(?\d+-\d+-\d+)\s+" + 
       @"(?\d+\:\d+(AM|PM))\s*" + 
       @"(?((?\)|(?\d+))\s*)" + 
       @"(?\w+))", 
       RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace 
       | RegexOptions.Compiled); 

Bildirim gerçeği, ihtiyaçlarınıza uygun ve dikkatli olun, bazı FTP istemcileri ... MSDOS veya Unix ya kadar liste okuyabilir

+0

"İnodes sayısı" ne anlama geliyor? – Nyerguds

+1

Tüm FTP LIST yaklaşımı hala sınırlı kullanım içindir çünkü UNIX'te dosya zaman kısmı eksik ve Windows'da saniyeler eksik. Sadece NLST ile dosya isimlerini almak daha iyidir ve her dosya için MDTM ve SIZE kullanarak dosya zamanını ve boyutunu alırsınız. libcurl bunun için destek var. – rustyx