EXE文件如何读取它自身的内容.

本文探讨了在Delphi环境下,如何使EXE文件读取自身内容的方法,包括使用CreateFile和TFileStream等API进行文件操作,适用于在EXE尾部附加数据并希望在运行时读取这些数据的场景。
EXE文件如何读取它自身的内容. Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061123125818182.html
我在EXE文件尾部追加一些数据,在EXE运行时想把这些数据读出来,Delphi不能自己打开自己,请问一下怎么记取?  
 

你会不会程序调用别的程序   会的话打开自己也是一样的    
   
  shellexecute  
   
  use   shellapi

http://www.delphibox.com/article.asp?articleid=422  
   
  还是先看下windows     pe文件格式  
  修改   可以通过很多方式的\  
   
  最终都是   映射成硬盘的文件

学习了

用文件流喽

读取是容易,,master   delphi7   就有demo  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var  
      nSize:   Integer;  
      hFile:   THandle;  
      strSize:   String;  
   
  begin  
      hFile   :=   CreateFile   (PChar   (ParamStr   (0)),  
          0,   FILE_SHARE_READ,   nil,   OPEN_EXISTING,   0,   0);  
      nSize   :=   GetFileSize   (hFile,   nil);  
      CloseHandle   (hFile);  
   
      SetLength   (strSize,   20);  
      Str   (nSize,   strSize);  
   
      Caption   :=   'Size   =   '   +   strSize;  
  end;  
   
  createfile打开,再read   即可;但是写到入exe文件中,需要点技巧  
   
  顶~~~vividw(vividw)   ~~~  
 

故意路过,不发表意见和谬论。:)   :)

然也

procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      fs:TFileStream;  
      strBuf:array[0..501]   of   char;  
  begin  
      fs:=TFileStream.Create(Application.ExeName,fmOpenRead);         //创建一个文件流对象  
      try  
          fs.Position:=1000;                                     //将文件流对象指针指到1000的位置  
          fs.ReadBuffer(strBuf,500);                     //读取长度为500的这一段内容  
          showmessage(strBuf);  
      finally  
          fs.Free;  
      end;  
  end;  
   
  主要思想应该都是这些了,其他的你可以自己再改造一下。

蹭分

刚好前几天写了这个..不过我不是这样的..写入就不说了,太简单了..读取是COPY自身到TEMP目录..再已文本读取..指向尾部..反向读取100个再CenterCat(string,'start:',':end')..

用   TFileStream   就可以打开。模式:   fmOpenRead   +   fmShareDenyNone

转载于:https://www.cnblogs.com/delphi2007/archive/2008/11/27/1342618.html

非常好,我们可以将配置路径从原来的 `config.json` 改为使用标准的 .NET **应用程序配置文件** —— 即 `.exe.config` 文件(对于 C# 控制台程序,默认是 `YourApp.exe.config`),这是 .NET Framework 和部分 .NET Core/.NET 5+ 兼容场景中常用的配置方式。 我们将使用 `System.Configuration` 来读取 `<appSettings>` 中的路径列表。注意:在 .NET 5+ 中 `System.Configuration` 不再默认启用,需手动添加引用。 --- ## ✅ 最终目标 - 配置写在 `FileCleaner.exe.config` 文件中 - 程序启动时自动读取该配置文件中的多个路径 - 删除超过 **1个月前修改** 的文件 - 每次删除操作记录到 `log.txt` - 使用 `.bat` 脚本运行程序 --- ## 1. 修改后的 C# 程序代码(支持 .exe.config) ```csharp using System; using System.Collections.Specialized; using System.Configuration; using System.IO; class Program { private static readonly string LogFile = "log.txt"; static void Main(string[] args) { try { // 从 .exe.config 的 appSettings 读取 PathsToDelete NameValueCollection settings = ConfigurationManager.AppSettings; string pathsSetting = settings["PathsToDelete"]; if (string.IsNullOrWhiteSpace(pathsSetting)) { WriteLog("警告: 配置文件中未找到 'PathsToDelete' 设置。"); return; } // 用分号 ';' 分隔多个路径(Windows 常用) var paths = pathsSetting.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(p => p.Trim()) .Where(p => !string.IsNullOrEmpty(p)) .ToList(); DateTime cutoffDate = DateTime.Now.AddMonths(-1); // 1个月前 foreach (var path in paths) { if (!Directory.Exists(path)) { WriteLog($"路径不存在: {path}"); continue; } DeleteOldFiles(path, cutoffDate); } } catch (Exception ex) { WriteLog($"程序异常: {ex.Message}\n{ex.StackTrace}"); } } static void DeleteOldFiles(string directoryPath, DateTime cutoffDate) { int deletedCount = 0; try { var files = Directory.GetFiles(directoryPath, "*", SearchOption.AllDirectories); foreach (string file in files) { try { var fileInfo = new FileInfo(file); if (fileInfo.LastWriteTime < cutoffDate) { fileInfo.Delete(); string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 删除文件: {file} | 修改时间: {fileInfo.LastWriteTime}"; WriteLog(logMessage); Console.WriteLine(logMessage); deletedCount++; } } catch (Exception ex) { WriteLog($"无法删除文件 {file}: {ex.Message}"); } } WriteLog($"完成处理路径 '{directoryPath}',共删除 {deletedCount} 个旧文件。"); } catch (Exception ex) { WriteLog($"访问路径时出错 '{directoryPath}': {ex.Message}"); } } static void WriteLog(string message) { try { File.AppendAllText(LogFile, message + Environment.NewLine); } catch { Console.WriteLine($"[LOG ERROR] 无法写入日志: {message}"); } } } ``` --- ## 2. 创建 `FileCleaner.exe.config` 配置文件 > ⚠️ 文件名必须与你的可执行文件名一致! > 如果你的程序叫 `FileCleaner.exe`,那么配置文件就是 `FileCleaner.exe.config` ### 示例:`FileCleaner.exe.config` ```xml <?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <!-- 使用分号分隔多个路径 --> <add key="PathsToDelete" value="C:\Temp\CleanupTest1; D:\OldData; E:\Archives" /> </appSettings> </configuration> ``` > 💡 注意: > - 路径之间用 `;` 分隔。 > - 可包含空格,代码中会 `.Trim()` 处理。 > - 此文件应和 `.exe` 放在同一目录下。 --- ## 3. 项目文件 (.csproj) 配置(重要!) 如果你使用的是 **.NET 5 / .NET 6 / .NET 7 / .NET 8**,需要显式添加对 `System.Configuration.ConfigurationManager` 的 NuGet 引用。 ### 在 `.csproj` 文件中加入: ```xml <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <!-- 或 net6.0、net7.0 等 --> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <!-- 添加此包以支持 AppSettings --> <PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.0" /> </ItemGroup> </Project> ``` 然后运行: ```bash dotnet restore dotnet build ``` --- ## 4. 发布并部署 构建发布版本: ```bash dotnet publish -c Release -r win-x64 --self-contained false ``` 输出目录如:`bin/Release/net8.0/win-x64/publish/` 确保以下文件都在同一目录: - `FileCleaner.exe` - `FileCleaner.exe.config` - (运行后生成)`log.txt` --- ## 5. 创建 `.bat` 批处理脚本运行程序 创建 `run_cleaner.bat`: ```bat @echo off cd /d "C:\YourApp\publish" FileCleaner.exe :: 可选:暂停查看结果 :: pause ``` 双击即可运行清理任务。 --- ## 🔍 关键说明 | 技术点 | 说明 | |--------|------| | `ConfigurationManager.AppSettings` | 读取 `.exe.config` 中 `<appSettings>` 的内容 | | 分号 `;` 分隔路径 | Windows 风格路径兼容,避免逗号歧义 | | `System.Configuration.ConfigurationManager` NuGet 包 | .NET Core 以后不再内置,必须手动引入 | | 自动识别同名 `.config` 文件 | .NET 运行时自动加载 `yourapp.exe.config` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值