使用C#从FTP下载文件

时间:2017-11-02 10:30:20

标签: c# python ftp

我有一个Python脚本,它遍历一个FTP目录,根据文件名和它所在的目录将任何新文件下载到特定位置。因为我使用的FTP库行为不端以意想不到的方式,我想将它移动到C#并将其与我拥有的表单应用程序合并。

问题是我似乎无法在C#中找到很多关于我需要的东西,所以我希望我能在这里得到一些帮助。下面我已经包含了我的Python代码,因为它可能会显示我想要做的比我的话更好。

def work(ftp, extensions):
    if not ftp.path.exists('/downloads'):
        ftp.mkdir('/downloads')
    ftp.chdir('/downloads')
    os.chdir('Z:\\')
    r = re.compile(r'\./(.+?)/.+?(\d+?)/.+?E?(\d{2})\..+(\..+?$)')
    for root, dirs, files in ftp.walk('.'):
        for file in files:
            _, ext = os.path.splitext(file)
            if ext in extensions:
                    file_path = ftp.path.join(root, file)
                    date_stripped_file_path = ftp.path.join(root, re.sub(r'\.20[12]\d', '', file))
                    local_file_path = r.sub(r'./\1/\2/\1 S0\2E\3\4', date_stripped_file_path)
                    if download(ftp, file_path, local_file_path, 'TV'):
                        m = r.match(date_stripped_file_path)
                        insert_into_database(m.group(1), int(m.group(2)), int(m.group(3)), os.path.abspath(local_file_path))

def download(ftp, source, target, type):
    if (not os.path.isfile(target)) or \
        os.path.getsize(target) < ftp.path.getsize(source):
        file_name = os.path.splitext(os.path.basename(target))[0]
        print(f'{get_timestamp()}... Downloading: {file_name}')
        # Create dir if not exists
        dirname = os.path.dirname(target)
        if not (os.path.exists(dirname) and os.path.isdir(dirname)):
            os.makedirs(dirname)
        try:
            def display_progress(chunk):
                bar.update(len(chunk))

            bar = click.progressbar(length=ftp.path.getsize(source))
            ftp.download(source, target, callback=display_progress)
            print('')
        except Exception as e:
            print(f'{get_timestamp()}... Dowmload failed')
            log_error(e, True)
        else:
            ftp.remove(source)
            return True
    else:
        ftp.remove(source)
        return True

我的work位于无限期while-loop,每10分钟就会运行一次。简而言之,我唯一需要在C#中找到的东西相当于for root, dirs, files in ftp.walk('.')

编辑:我更喜欢使用.NET中包含的库,但如果这变得复杂,我可以使用外部库。

1 个答案:

答案 0 :(得分:1)

您可以使用随.NET Framework提供的WebClient类。

可以在Microsoft提供的官方MSDN页面中找到通过FTP下载文件的示例

https://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest(v=vs.110).aspx