Non credo o almeno non qualcosa che abbia installato io volontariamente (considera che uso Windows Vista, VS 2008,).
L'altra ipotesi potrebbe essere dovuta al fatto che la pagina ASPX non ha diritti di lettura/scrittura sulla directory dei dati (il semplice FileExists non è sufficiente per determinare tale condizione). In questo caso dovresti ricorrere alle CAS (Code Access Security, vedi
http://msdn.microsoft.com/en-us/library/930b76w0(VS.80).aspx o anche questo
http://www.devx.com/vb2themax/Article/19886/1954). Ma per non complicarci troppo la vita potresti banalmente provare ad aprire il file usando un oggetto FileStream (sempre che tu non abbia già la certezza matematica di possedere i diritti richiesti).
Nel frattempo ti posto il codice completo dell'esempio che ho usato per tentare di simulare il tuo caso (Application Console in C#). Sostituendo i vari percorsi potresti usare questo codice per verificare se da te funziona o meno.
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Data.Common;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
static string _pathDbf = @"C:\???\???\???\???\dbf.1_2";
static string cnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}\\;Extended Properties=dBase III";
static void Main(string[] args)
{
Console.WriteLine("Letto valore: {0}", getItem());
Console.ReadLine();
}
static public String getItem()
{
OleDbConnection conn = null;
DbDataReader reader = null;
OleDbCommand cmd;
string filename = "CUSTOMER_12345678-1.25.DBF";
string firstField = null;
try
{
bool simulaErrore = false;
string fullPathFull, fullPathShort;
fullPathFull = Path.Combine(_pathDbf, filename);
if (simulaErrore)
{
fullPathShort = fullPathFull;
}
else
{
// Ottengo il nome del file in versione SHORT
fullPathShort = FSHelper.ToShortPath(fullPathFull);
// Riassegno i valori nel formato "short" alle rispettive variabili
_pathDbf = FSHelper.ToShortPath(_pathDbf);
// Notare l'uso delle p.quadre "[" e "]".
// In teoria usando le quadre il nome del file funziona anche nel formato lungo
filename = "[" + Path.GetFileName(fullPathShort) + "]";
}
cnnStr = string.Format(cnnStr, _pathDbf);
FileInfo fi = new FileInfo(fullPathShort);
if (!fi.Exists)
throw new Exception("Errore in scrittura: file non trovato " + filename);
// Specifico il nome del file tra parentesi quadre.
string sql = "select * from " + filename;
conn = new OleDbConnection(cnnStr);
conn.Open();
cmd = new OleDbCommand(sql, conn);
reader = cmd.ExecuteReader();
if (reader.Read())
{
firstField = Convert.ToString(reader.GetValue(0));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
if (reader != null)
reader.Close();
if (conn != null)
conn.Close();
}
return firstField;
}
}
class FSHelper
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint GetShortPathName(
[MarshalAs(UnmanagedType.LPTStr)] string lpszLongPath,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszShortPath,
uint cchBuffer);
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint GetLongPathName(
[MarshalAs(UnmanagedType.LPTStr)] string lpszShortPath,
[MarshalAs(UnmanagedType.LPTStr), Out] StringBuilder lpszLongPath,
uint cchBuffer);
public static string ToLongPath(string shortName)
{
uint bufferSize = 256;
StringBuilder longNameBuffer = new StringBuilder((int)bufferSize);
uint result = GetLongPathName(shortName, longNameBuffer, bufferSize);
return longNameBuffer.ToString();
}
public static string ToShortPath(string longName)
{
uint bufferSize = 256;
StringBuilder shortNameBuffer = new StringBuilder((int)bufferSize);
uint result = GetShortPathName(longName, shortNameBuffer, bufferSize);
return shortNameBuffer.ToString();
}
}
}
Ciao.