[요청]
1. C#으로 SFTP 클라이언트를 만들고 싶어
2. 서버 접속정보는 IP:172.16.32.108, PORT:22, ID:admin, PASSWORD: hks003으로 하고
3. 나의 윈도 PC D:\temp\test.zip 파일을 서버 쪽 /home/hks003/ 디렉터리에 복사하는 기능으로
4. 윈도 클라이언트 프로그램 폼에서 접속버튼을 클릭했을 때 정상접속 되었으면 메시지를 띄워주고
5. 정상접속상태에서
6. 전송버튼을 누르면 전송 중인 상태를 %로 표시해 주고 정상전송이 완료되면 100%를 디스플레이할 수 있는
윈도 프로그램을 작성 부탁해
C#에서 SFTP 기능을 구현하려면 가장 널리 사용되는 SSH.NET 라이브러리를 활용해야 합니다. 비주얼 스튜디오의 NuGet 패키지 관리자에서 SSH.NET (Renci.SshNet)을 먼저 설치해야 한다.
- 사전 준비 (NuGet 패키지 설치)
- 비주얼 스튜디오 상단 메뉴에서 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔을 연다.
- 콘솔창에
Install-Package SshNet.Core(또는 Install-Package Ssh.NET)를 입력하여 라이브러리를 설치한다.
- 폼 디자인 구성 요소
- 접속 버튼 (btnConnect)
- 전송 버튼 (btnSend)
- 상태 표시 레이블 (lblStatus) 또는 진행률 바 (progressBar1)
- 전체 소스 코드 구현 예시
using System;
using System.IO;
using System.Windows.Forms;
using Renci.SshNet;
namespace SftpClientApp
{
public partial class MainForm : Form
{
private SftpClient sftpClient;
// 요구하신 접속 정보 설정
private readonly string host = "172.16.32.108";
private readonly int port = 22;
private readonly string username = "admin";
private readonly string password = "hks003";
public MainForm()
{
InitializeComponent();
}
// 1. 접속 버튼 클릭 이벤트
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
sftpClient = new SftpClient(host, port, username, password);
sftpClient.Connect();
if (sftpClient.IsConnected)
{
MessageBox.Show("정상적으로 접속되었습니다!", "접속 성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"접속 실패: {ex.Message}", "연결 오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// 2. 전송 버튼 클릭 이벤트 (% 표시 및 100% 완료 처리)
private void btnSend_Click(object sender, EventArgs e)
{
if (sftpClient == null || !sftpClient.IsConnected)
{
MessageBox.Show("먼저 SFTP 서버에 접속해주세요.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
string localFilePath = @"D:\temp\test.zip";
string remoteFilePath = "/home/hks003/test.zip";
if (!File.Exists(localFilePath))
{
MessageBox.Show($"로컬 파일을 찾을 수 없습니다: {localFilePath}", "파일 오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
using (var fileStream = new FileStream(localFilePath, FileMode.Open))
{
long totalLength = fileStream.Length;
// UploadFile 메서드의 콜백을 통해 업로드 진행률 실시간 수신
sftpClient.UploadFile(fileStream, remoteFilePath, (uploadedBytes) =>
{
int percentage = (int)((double)uploadedBytes / totalLength * 100);
// 비동기 스레드에서 UI를 안전하게 업데이트하기 위해 Invoke 사용
this.Invoke((MethodInvoker)(() =>
{
lblStatus.Text = $"{percentage}% 전송 중...";
if (progressBar1 != null) progressBar1.Value = percentage;
}));
});
}
// 전송 완료 시 100% 확정 디스플레이
this.Invoke((MethodInvoker)(() =>
{
lblStatus.Text = "100% 전송 완료!";
if (progressBar1 != null) progressBar1.Value = 100;
}));
MessageBox.Show("파일 전송이 정상적으로 완료되었습니다!", "전송 완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"전송 중 오류가 발생했습니다: {ex.Message}", "전송 오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
코드 핵심 포인트
- SftpClient: 지정된 IP, 포트, 계정 정보를 바탕으로 안전하게 SFTP 세션을 맺는다.
- UploadFile 콜백: 파일이 전송되는 동안 전송된 바이트(uploadedBytes)를 전체 용량과 비교하여 실시간 퍼센트(%)를 계산한다.
- UI 스레드 동기화 (Invoke): 네트워크 및 파일 I/O 작업은 별도의 백그라운드 스레드에서 처리되므로, 폼의 레이블이나 프로그레스바를 안전하게 갱신하려면 Invoke를 사용해야 윈도우 멈춤 현상 없이 정상적으로 퍼센트가 표시된다.
[ 결과 ]
- 정상동작확인했음-
'프로그램 > C#' 카테고리의 다른 글
| [C#] 실행 파일(EXE) 의 아이콘을 변경 & 각 폼의 아이콘을 변경 (0) | 2026.09.07 |
|---|---|
| [C#] NModbus 라이브러리 사용 예 (Ver 1) (0) | 2026.08.24 |
| [C#] NModbus 라이브러리 사용 예 (Ver 2) (0) | 2026.08.24 |
| [C#] NModbus 라이브러리 사용 예 (Ver 3) (0) | 2026.08.24 |
| [C#] NModbus 라이브러리 사용 예 (Ver 4) (0) | 2026.08.24 |
| [C#] INI 대신 Json 을 사용한 환경값 저장 모듈 (0) | 2026.07.01 |
| [C#] 디버깅 출력 예 (0) | 2026.06.29 |
| [C#] 인터페이스 사용 (0) | 2026.05.30 |
| [C#] 콘솔 앱 (.NET Core)로 작성된DLL 리눅에서 실행키 위한 환경구축 (0) | 2018.09.21 |
| [ C# ] Embedded Compact7 용 프로그램 컴파일 속도향상 (0) | 2017.07.01 |
















