はじめに (対象読者・この記事でわかること)

この記事は、C#でネットワーク上の別PCにあるファイルを操作したい方を対象にしています。特に、社内のファイルサーバーからデータを読み書きする必要がある業務システム開発者の方におすすめです。

この記事を読むことで、LAN内の別PCに設定された共有フォルダに対して、C#アプリケーションから安全にアクセスし、ファイルの読み書き、コピー、削除などの操作ができるようになります。また、実装時に起こりがちなアクセス権限の問題や、接続エラーの対処法も学べます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - C#の基本的な文法(ファイル操作クラスの使用経験) - Windowsの共有フォルダの基本的な知識 - ネットワークドライブの概念

LAN環境でのファイル共有の重要性と利点

現代の業務システムでは、単一のPCで完結することはほとんどありません。複数のPCでデータを共有し、協調して業務を進めることが当たり前になっています。特に、ファイルサーバーを設置し、そこに重要なデータを集約管理する構成は多くの企業で採用されています。

C#でこれらの共有リソースにアクセスすることで、以下のようなメリットがあります:

  • 中央集権的なデータ管理:全てのデータを一箇所に集約し、バックアップや管理が容易になります
  • リアルタイムなデータ共有:複数のユーザーが同じデータにアクセスし、最新の情報を共有できます
  • セキュリティの向上:共有フォルダにアクセス権限を設定することで、必要な人だけがデータにアクセスできます
  • 業務効率化:手動でファイルをコピーする必要がなく、自動化された処理が実現できます

共有フォルダの設定からC#実装までの詳細手順

ステップ1:共有フォルダの設定とアクセス権限の構成

まず、ファイルを共有したいPC(サーバー側)で共有フォルダを設定します。

  1. 共有フォルダの作成 ファイルエクスプローラーで新しいフォルダを作成し、右クリックして「プロパティ」を選択します。

  2. 共有の設定 「共有」タブを選択し、「詳細共有」で「このフォルダを共有する」にチェックを入れます。

  3. アクセス権限の設定 「アクセス許可」で以下の設定を行います: - 読み取り専用にするか、読み書き可能にするかを選択 - 特定のユーザーまたはグループに制限 - 必要に応じて「Everyone」にアクセスを許可(開発環境のみ推奨)

  4. ネットワークパスの確認 共有名を設定し、ネットワークパス(例:\ServerPC\SharedFolder)をメモしておきます。

ステップ2:C#でのネットワークドライブ接続とファイル操作

C#から共有フォルダにアクセスするには、主に2つの方法があります。

方法1:UNCパスを直接使用する(推奨)

Csharp
using System; using System.IO; class NetworkFileOperation { // 共有フォルダのUNCパス private static readonly string sharedFolderPath = @"\\192.168.1.100\SharedFolder"; static void Main() { try { // フォルダの存在確認 if (Directory.Exists(sharedFolderPath)) { Console.WriteLine("共有フォルダにアクセス可能です"); // ファイルの読み込み string filePath = Path.Combine(sharedFolderPath, "data.txt"); if (File.Exists(filePath)) { string content = File.ReadAllText(filePath); Console.WriteLine($"ファイル内容: {content}"); } // ファイルの書き込み string writePath = Path.Combine(sharedFolderPath, "output.txt"); File.WriteAllText(writePath, "ネットワーク経由で書き込みました"); // ファイルのコピー string copyPath = Path.Combine(sharedFolderPath, "backup", "data_backup.txt"); Directory.CreateDirectory(Path.GetDirectoryName(copyPath)); File.Copy(filePath, copyPath, true); } } catch (UnauthorizedAccessException ex) { Console.WriteLine($"アクセス権限がありません: {ex.Message}"); } catch (IOException ex) { Console.WriteLine($"ネットワークエラーが発生しました: {ex.Message}"); } } }

方法2:WNetAddConnection2を使用した認証付き接続

Csharp
using System; using System.Runtime.InteropServices; using System.IO; class NetworkConnectionWithAuth { [DllImport("mpr.dll")] private static extern int WNetAddConnection2(NetResource lpNetResource, string lpPassword, string lpUsername, int dwFlags); [DllImport("mpr.dll")] private static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce); [StructLayout(LayoutKind.Sequential)] private class NetResource { public int dwScope; public int dwType; public int dwDisplayType; public int dwUsage; public string lpLocalName; public string lpRemoteName; public string lpComment; public string lpProvider; } public static void ConnectToSharedFolder(string remotePath, string username, string password) { NetResource nr = new NetResource { dwType = 1, // RESOURCETYPE_DISK lpRemoteName = remotePath }; int result = WNetAddConnection2(nr, password, username, 0); if (result == 0) { Console.WriteLine("ネットワーク接続が確立されました"); // ファイル操作を実行 PerformFileOperations(remotePath); } else { Console.WriteLine($"接続エラー: {result}"); } } private static void PerformFileOperations(string path) { try { // ファイル一覧の取得 string[] files = Directory.GetFiles(path); Console.WriteLine($"ファイル数: {files.Length}"); // 新規フォルダの作成 string newFolder = Path.Combine(path, "NewFolder"); Directory.CreateDirectory(newFolder); // ログファイルの書き込み string logFile = Path.Combine(newFolder, "log.txt"); File.WriteAllText(logFile, $"アクセス時刻: {DateTime.Now}"); } catch (Exception ex) { Console.WriteLine($"ファイル操作中にエラーが発生: {ex.Message}"); } } }

ハマった点やエラー解決

実装中に遭遇する代表的な問題とその解決策を紹介します。

エラー1:「アクセスが拒否されました」エラー

症状UnauthorizedAccessExceptionが発生し、共有フォルフォルダにアクセスできない

原因: - 共有フォルダのアクセス権限が不足 - 実行アカウントに適切な権限がない

解決策

  1. 資格情報の明示的指定
Csharp
// 資格情報を使用した接続文字列 string sharedPath = @"\\server\share"; string username = "domain\\username"; string password = "password"; // プロセスを特定の資格情報で起動 var psi = new System.Diagnostics.ProcessStartInfo(); psi.UserName = username; psi.Password = ConvertToSecureString(password);
  1. 共有フォルダの権限確認 - サーバー側で「セキュリティ」タブも確認(単に「共有」タブだけでなく) - 必要に応じて「Everyone」にフルコントロール権限を付与(開発環境のみ)

エラー2:「ネットワークパスが見つかりません」エラー

症状DirectoryNotFoundExceptionが発生

原因: - IPアドレスやコンピューター名が正しくない - ネットワークが切断されている - ファイアウォールでブロックされている

解決策

  1. ネットワーク接続の確認
Csharp
// Pingで接続確認 using System.Net.NetworkInformation; public static bool IsServerReachable(string serverName) { try { using (var ping = new Ping()) { var reply = ping.Send(serverName, 3000); return reply.Status == IPStatus.Success; } } catch { return false; } }
  1. 代替パスの使用
Csharp
// IPアドレスとコンピューター名の両方を試す string[] possiblePaths = { @"\\192.168.1.100\share", @"\\ServerPC\share", @"\\server.domain.local\share" }; foreach (var path in possiblePaths) { if (Directory.Exists(path)) { return path; } }

まとめ

本記事では、C#を使ってLAN内の別PCにある共有フォルダにアクセスし、ファイル操作を行う方法を解説しました。

  • 共有フォルダの設定方法:アクセス権限を適切に設定することが重要
  • UNCパスを使用したシンプルな実装:認証が不要な場合の標準的な方法
  • 認証付き接続の実装:WNetAddConnection2を使用したセキュアな接続
  • よくあるエラーと対処法:アクセス拒否やネットワークエラーの解決方法

この記事を通して、ネットワーク越しのファイル操作が安全かつ効率的に行えるようになり、業務システムの自動化や効率化に貢献できるでしょう。

今後は、大容量ファイルの転送効率化、接続プーリングの実装、非同期処理での実装方法についても記事にする予定です。

参考資料