Prieš kelias dienas susidūriau su įdomiu uždaviniu – suvienodinti per FTP kopijuojamų failų modifikavimo datą ir laiką tarp visų klasterio serverių. Pirma paaiškinsiu problemą: klasteryje yra kelios dešimtys serverių, todėl kopijuojant failus jų modifikavimo data gali skirtis keliomis sekundėmis. Tarkim, vartotojas kreipiasi į serverį, parsisiunčia failą ir jį užkešuoja. Už sekundės jis kreipiasi vėl to paties failo, patenka į kitą klasterio serverį ir tas potencialiai gali pasakyti, kad failo modifikavimo data yra keliomis sekundėmis naujesnė. Rezultate vartotojas turės parsisiųsti failą iš naujo, nors tai yra tas pats failas. Kaip matyti, be reikalo išnaudojamas tiek procesorius, tiek tinklas.

Grįžtant prie problemos. Norint pakeisti nutolusiame FTP esančio failo datą, reikia įvykdyti komandą MFMT (Modify Fact: Modification Time) arba MFCT (Modify Fact: Creation Time). Šios komandos dar nėra oficialaus standarto dalis, bet mūsų naudojamas FileZilla FTP serveris jas palaiko (informacijai: IIS FTP serveris šių komandų nepalaiko). Kai jau galvojau, kad užteks tiesiog iškviesti MFMT komandą pasirodė, kad standartinė .NET FtpWebRequest klasė neturi nei tokio metodo, nei kito būdo ją iškviesti. Teko keisti FTP biblioteką į kitą alternatyvą – Alex FTPS Library (prieinamas ir iš NuGet galerijos). Nors minėta biblioteka irgi neturi reikalingo metodo, ji turi galimybę pačiam suformuoti ir išsiųsti norimą komandą. Taip gimė praplėtimo metodas SetModifiedTime:

internal static class FTPSClientExtensions
{
    public static void SetModifiedDate(this FTPSClient client, string path, DateTime lastModified)
    {
        var command = string.Format("MFMT {0} {1}", lastModified.ToString("yyyyMMddHHmmss"), path);
        client.SendCustomCommand(command);
    }
}

Taigi, iš pirmo žvilgsnio paprasta užduotis (MFMT komandos iškvietimas) pasibaigė visos FTP bibliotekos keitimu…

Patiko (0)

Rodyk draugams