C#--Directory\ FileStream

本文介绍了如何使用C#中的Directory类来创建、删除文件夹,获取当前目录、列出子目录和文件;并演示了FileStream结合StreamWriter进行文件写入的具体用法。
一:Directory:指定路径下创建和删除文件

用于:公开用于通过目录和子目录进行创建、移动和枚举的静态方法。 无法继承此类。

方法:

string path=@"‪E:\迅雷下载\1";

1、 //Directory.CreateDirectory(path); //在指定的路径下创建一个文件夹,如果文件夹内有东西在创建不报异常。

2、 Directory.Delete(path, true);//这个方法是删除指定路径下的文件夹,如果文件夹内有东西,可以采用第二个重载,就不会报异常。

3、string ps = Directory.GetCurrentDirectory( ); //获取当前程序所在目录
Console.WriteLine(ps);

4、string[] dire = Directory.GetDirectories(path); //获取制定文件夹下所有文件夹的全路径

        for (int i = 0; i < dire.Length; i++)
        {
            Console.WriteLine(dire[i]);
        }

5、string[] file = Directory.GetFiles(path);//获取这个文件夹下面所有文件的全路径

        for (int i = 0; i < file.Length; i++)
        {
            Console.WriteLine(file[i]);
        }
二:FileStream:StreamReader and StreamWriter

用于:为文件提供 Stream,既支持同步读写操作,也支持异步读写操作。

 string path = @"‪‪D:\桌面\桌面\爱民\123.txt";
            //FileStream fs= File.Open(path, FileMode.Open);

            //FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);

            //using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            //{

            //    using (StreamReader sr = new StreamReader(fs,Encoding.Default))
            //    {

            //        //while (!sr.EndOfStream )
            //        //{
            //            Console.WriteLine(sr.ReadToEnd());
            //        //}


            //    }

            //}

//下面是方法,下面由前面导出来的。

            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write, FileShare.Write))
            {
                using(StreamWriter sw=new StreamWriter(fs,Encoding.Default ))
                {
                    sw.Write("哈哈");
                }
            }

            Console.ReadKey();
<think>我们参考用户提供的引用内容,特别是引用[1]和引用[3]关于FileStream类的使用,以及引用[2]中提到的关于Process.Start方法在x86应用程序下找不到系统文件的问题(虽然问题不同,但思路可借鉴:路径问题、系统重定向问题)。 用户问题:C#使用FileStream时提示找不到文件的解决办法。 分析可能的原因及解决方案: 1. 文件路径不正确:可能是相对路径或绝对路径有误。 2. 文件路径包含非法字符。 3. 文件不存在。 4. 权限问题:应用程序没有访问该路径的权限。 5. 在64位系统中,32位应用程序访问系统目录(如System32)时的重定向问题(类似引用[2]的问题)。 解决方案: 1. 检查文件路径- 使用绝对路径,避免相对路径的歧义。 - 使用`Path.Combine`来构建路径,避免手动拼接。 - 打印出完整路径,确认路径是否正确。 2. 检查文件是否存在: - 在打开文件之前,使用`File.Exists`方法检查文件是否存在。 3. 处理路径中的非法字符: - 使用`Path.GetInvalidPathChars`和`Path.GetInvalidFileNameChars`来检查路径或文件名中是否包含非法字符。 4. 权限问题: - 确保应用程序有权限访问目标文件(读/写)。如果是系统文件或受保护的目录,可能需要以管理员权限运行。 5. 系统重定向问题(针对32位应用程序访问系统目录): - 在64位系统上运行32位应用程序时,对`System32`目录的访问会被重定向到`SysWOW64`。如果确实需要访问真正的`System32`目录,可以使用`Environment.GetFolderPath(Environment.SpecialFolder.System)`来获取正确的系统目录路径,或者禁用文件系统重定向(通过P/Invoke调用`Wow64DisableWow64FsRedirection`,但需谨慎)。 6. 使用FileStream时,注意构造函数中的参数: - `FileStream`构造函数中有多种重载,确保使用正确的参数。例如,使用`FileMode.Open`时,如果文件不存在会抛出异常。如果希望文件不存在时创建,则使用`FileMode.OpenOrCreate`。 示例代码: ```csharp string filePath = @"C:\path\to\your\file.txt"; // 替换为你的文件路径 // 检查文件是否存在 if (!File.Exists(filePath)) { Console.WriteLine("文件不存在!"); return; } // 检查路径是否包含非法字符 if (filePath.IndexOfAny(Path.GetInvalidPathChars()) != -1) { Console.WriteLine("路径包含非法字符!"); return; } try { // 使用FileStream打开文件 using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { // 读取文件内容等操作 } } catch (UnauthorizedAccessException ex) { Console.WriteLine("没有权限访问文件: " + ex.Message); } catch (Exception ex) { Console.WriteLine("发生错误: " + ex.Message); } ``` 注意:如果文件路径是用户输入的或者动态生成的,务必进行严格的验证和异常处理。 特殊情况:如果文件位于网络路径,还需要确保网络路径可用,并且应用程序有访问权限。 另外,引用[3]中提到,FileStream是按字节读取的,但这与找不到文件的问题没有直接关系。 根据引用[2]的启示,如果是访问系统目录(如System32)下的文件,在32位应用程序中可能会被重定向到SysWOW64目录,导致找不到文件。此时,可以通过以下方式获取正确的系统目录: ```csharp string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System); string filePath = Path.Combine(systemPath, "osk.exe"); // 例如,获取osk.exe的正确路径 ``` 或者,临时禁用文件系统重定向(需要管理员权限,并且操作后要恢复): ```csharp [DllImport("kernel32.dll", SetLastError = true)] private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); IntPtr oldValue = IntPtr.Zero; if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess) { // 当前是32位进程运行在64位系统上 Wow64DisableWow64FsRedirection(ref oldValue); try { // 这里访问System32目录,不会被重定向 using (FileStream fs = new FileStream(@"C:\Windows\System32\somefile", FileMode.Open)) { // ... } } finally { Wow64RevertWow64FsRedirection(oldValue); } } ``` 请谨慎使用重定向禁用,因为它会影响整个线程的文件系统操作。 总结:找不到文件的问题通常与路径有关,请仔细检查路径,并考虑权限和系统重定向问题。 </think>### C#中使用FileStream时提示找不到文件的解决方案 在C#中使用`FileStream`时出现"找不到文件"错误通常有以下原因及解决方案: #### 📍 1. 文件路径错误(最常见原因) - **问题特征**:绝对路径错误、相对路径歧义或路径格式不正确 - **解决方案**: ```csharp // 使用完整绝对路径代替相对路径 string fullPath = Path.GetFullPath("yourfile.txt"); // 使用Path.Combine拼接路径(避免手动拼接错误) string safePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data", "file.txt"); // 在创建FileStream前验证路径 if (!File.Exists(fullPath)) { throw new FileNotFoundException($"文件未找到: {fullPath}"); } ``` #### 📂 2. 特殊目录访问问题(涉及System32等系统目录) - **问题特征**:32位程序访问`System32`时触发文件系统重定向[^2] - **解决方案**: ```csharp // 获取正确的系统目录(自动处理重定向) string systemDir = Environment.GetFolderPath(Environment.SpecialFolder.System); string targetFile = Path.Combine(systemDir, "osk.exe"); // 示例文件 // 或禁用文件系统重定向(需管理员权限) [DllImport("kernel32.dll")] static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); IntPtr wow64Value = IntPtr.Zero; if (Environment.Is64BitOperatingSystem) { Wow64DisableWow64FsRedirection(ref wow64Value); // 此处创建FileStream // 操作完成后恢复: Wow64RevertWow64FsRedirection(wow64Value); } ``` #### 🔐 3. 文件访问权限不足 - **问题特征**:程序无权限访问目标文件/目录 - **解决方案**: ```csharp // 检查文件权限 FileInfo fileInfo = new FileInfo(fullPath); if ((fileInfo.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { // 处理只读文件 } // 以管理员权限运行程序(需修改程序清单) // 在app.manifest中添加: <requestedExecutionLevel level="requireAdministrator"/> ``` #### ⚠️ 4. 文件锁定冲突 - **问题特征**:文件已被其他进程占用 - **解决方案**: ```csharp try { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { // 执行操作 } } catch (IOException ex) when (ex.HResult == -2147024864) { // 0x80070020 // 处理文件锁定错误 } ``` #### 📝 5. 特殊字符处理 - **问题特征**:路径包含空格/中文/特殊字符 - **解决方案**: ```csharp // 使用URI格式处理特殊字符 string encodedPath = new Uri("file:///C:/带空格 的目录/文件.txt").LocalPath; // 使用逐字字符串 string path = @"C:\Program Files (x86)\data\测试文件.txt"; ``` ### 最佳实践建议 1. **始终验证路径**: ```csharp if (!Path.IsPathFullyQualified(filePath)) { // 拒绝相对路径 } ``` 2. **使用`using`语句**确保资源释放: ```csharp using (FileStream fs = new FileStream(path, FileMode.Open)) { // 文件操作 } ``` 3. **错误处理模板**: ```csharp try { using (var fs = new FileStream(path, FileMode.Open)) { // 读取操作(参考引用[3]的字节流处理) byte[] buffer = new byte[1024]; int bytesRead = fs.Read(buffer, 0, buffer.Length); string content = Encoding.UTF8.GetString(buffer, 0, bytesRead); } } catch (FileNotFoundException ex) { // 定制化处理文件不存在 } catch (DirectoryNotFoundException) { // 目录不存在处理 } catch (UnauthorizedAccessException) { // 权限错误处理 } ``` > **关键提示**:当处理系统文件(如`System32`目录下的文件)时,32位程序在64位系统上会自动重定向到`SysWOW64`目录[^2]。使用`Environment.GetFolderPath()`可避免此问题。
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值