Upload, download, and backup controller files on your Fanuc robot using FTP and CGTP.

## FTP : Full file management

FTP provides complete file management: upload, download, delete, rename, and directory operations.

**C# : FtpFileManagement**
```csharp
using UnderAutomation.Fanuc;

public class FtpFileManagement
{
  static void Main()
  {
    FanucRobot robot = new FanucRobot();
    ConnectionParameters parameters = new ConnectionParameters("192.168.0.1");
    parameters.Ftp.Enable = true;
    parameters.Ftp.FtpUser = "";
    parameters.Ftp.FtpPassword = "";
    robot.Connect(parameters);

    /**/
    // Upload a TP program to the controller
    robot.Ftp.DirectFileHandling.UploadFileToController(@"C:\Programs\MyPrg.tp", "md:/MyPrg.tp");

    // Download a file from the robot
    robot.Ftp.DirectFileHandling.DownloadFileFromController(@"C:\Backup\Backup.va", "md:/Backup.va");

    // Delete a file
    robot.Ftp.DirectFileHandling.DeleteFile("md:/OldProgram.tp");

    // List files in a directory
    var items = robot.Ftp.DirectFileHandling.GetListing("md:/");
    foreach (var item in items)
      Console.WriteLine($"{item.Name} ({item.Type})");

    // Create and delete directories
    robot.Ftp.DirectFileHandling.CreateDirectory("md:/NewFolder");

    // Rename a file
    robot.Ftp.DirectFileHandling.Rename("md:/old.tp", "md:/new.tp");

    // Check file existence
    bool exists = robot.Ftp.DirectFileHandling.FileExists("md:/MyPrg.tp");
    /**/
  }
}
```

**Python : FtpFileManagement**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot
from underautomation.fanuc.connection_parameters import ConnectionParameters

robot = FanucRobot()
parameters = ConnectionParameters("192.168.0.1")
parameters.ftp.enable = True
parameters.ftp.ftp_user = ""
parameters.ftp.ftp_password = ""
robot.connect(parameters)

##
# Upload a TP program to the controller
robot.ftp.direct_file_handling.upload_file_to_controller("C:/Programs/MyPrg.tp", "md:/MyPrg.tp")

# Download a file from the robot
robot.ftp.direct_file_handling.download_file_from_controller("C:/Backup/Backup.va", "md:/Backup.va")

# Delete a file
robot.ftp.direct_file_handling.delete_file("md:/OldProgram.tp")

# List files in a directory
items = robot.ftp.direct_file_handling.get_listing("md:/")
for item in items:
    print(f"{item.name} ({item.type})")

# Create a directory
robot.ftp.direct_file_handling.create_directory("md:/NewFolder")

# Rename a file
robot.ftp.direct_file_handling.rename("md:/old.tp", "md:/new.tp")

# Check file existence
exists = robot.ftp.direct_file_handling.file_exists("md:/MyPrg.tp")
##
```

**C# : UploadDownloadBackupFilesFtp**
```csharp
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Common;
using UnderAutomation.Fanuc.Common.Files.Variables;
using UnderAutomation.Fanuc.Ftp;

public class UploadDownloadBackupFilesFtp
{
    static void Main()
    {
        FanucRobot robot = new FanucRobot();
        robot.Connect("192.168.0.1");

        /**/
        // Backup: list all files and download
        FtpListItem[] files = robot.Ftp.DirectFileHandling.GetListing("md:/");
        foreach (var file in files)
        {
            robot.Ftp.DirectFileHandling.DownloadFileFromController($"backup/{file.Name}", $"md:/{file.Name}");
        }

        // Upload a .tp file
        robot.Ftp.DirectFileHandling.UploadFileToController("C:/programs/MY_PROGRAM.tp", "md:/MY_PROGRAM.tp");

        // Download specific variable files
        robot.Ftp.DirectFileHandling.DownloadFileFromController(out byte[] numreg, "md:/numreg.va");
        robot.Ftp.DirectFileHandling.DownloadFileFromController(out byte[] posreg, "md:/posreg.va");

        // Or use convenience methods
        NumregFile regs = robot.Ftp.KnownVariableFiles.GetNumregFile();
        /**/
    }
}
```

**Python : UploadDownloadBackupFilesFtp**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot
import os

robot = FanucRobot()
robot.connect("192.168.0.1")

##
# Backup: list all files and download
files = robot.ftp.list_files()
os.makedirs("backup", exist_ok=True)
for file in files:
    data = robot.ftp.download_file_as_bytes(f"md:/{file.name}")
    with open(f"backup/{file.name}", "wb") as f:
        f.write(data)

# Upload a .tp file
robot.ftp.upload_file_from_disk("C:/programs/MY_PROGRAM.tp")

# Download specific variable files
numreg = robot.ftp.download_file_as_bytes("md:/numreg.va")
posreg = robot.ftp.download_file_as_bytes("md:/posreg.va")

# Or use convenience methods
regs = robot.ftp.known_variable_files.get_numeric_registers()
##
```

## CGTP : File download via HTTP

CGTP provides file listing and download through the robot's web server:

**C# : UploadDownloadBackupFilesCgtp**
```csharp
using System;
using UnderAutomation.Fanuc;
using UnderAutomation.Fanuc.Cgtp;

public class UploadDownloadBackupFilesCgtp
{
    static void Main()
    {
        FanucRobot robot = new FanucRobot();
        robot.Connect("192.168.0.1");

        /**/
        // List TP programs
        CgtpAsciiFileItem[] programs = robot.Cgtp.Http.ListTpPrograms();

        // Download a file as string
        string content = robot.Cgtp.Http.DownloadAsString("numreg.va");

        // Download a file as bytes
        byte[] data = robot.Cgtp.Http.DownloadAsBytes("posreg.va");

        // List files via CGTP protocol
        string[] files = robot.Cgtp.ListFiles("MD:");
        /**/
    }
}
```

**Python : UploadDownloadBackupFilesCgtp**
```python
from underautomation.fanuc.fanuc_robot import FanucRobot

robot = FanucRobot()
robot.connect("192.168.0.1")

##
# List TP programs
programs = robot.cgtp.http.list_tp_programs()

# Download a file as string
content = robot.cgtp.http.download_as_string("numreg.va")

# Download a file as bytes
data = robot.cgtp.http.download_as_bytes("posreg.va")

# List files via CGTP protocol
files = robot.cgtp.list_files("MD:")
##
```

See also: [CGTP Alarms, comments & files](/fanuc/documentation/cgtp-alarms-files)

## Protocol comparison

| Feature | FTP | CGTP |
|---------|-----|------|
| **Upload** | Yes | No |
| **Download** | Yes | Yes |
| **Delete** | Yes | Only jobs |
| **Rename** | Yes | Only jobs |
| **Directory ops** | Yes | No |
| **List files** | Yes | Yes |
| **Authentication** | Optional | Optional |